【问题标题】:Spring MVC "Request processing failed" 500 errorSpring MVC“请求处理失败”500错误
【发布时间】:2015-07-11 17:52:28
【问题描述】:

我是 Spring 的新手,正在尝试通过教程学习。我有一个问题。我将基于 xml 的配置转换为基于注释的配置。 this 是教程。

我收到 HTTP 500 错误。这是完整的堆栈跟踪。

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause


root cause

   java.lang.NullPointerException   com.ulotrix.spring.service.PersonServiceImpl.listPersons(PersonServiceImpl.java:35) 
    com.ulotrix.spring.controller.PersonController.listPersons(PersonController.java:28)    

     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

项目结构

AppConfig.java

@EnableWebMvc
@Configuration
@ComponentScan({ "com.ulotrix.spring" })
public class AppConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

@Bean
public SessionFactory sessionFactory() {

    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
    builder.scanPackages("com.ulotrix.spring.model");
    builder.addProperties(getHibernationProperties());

    return builder.buildSessionFactory();
}

private Properties getHibernationProperties() {

    Properties prop = new Properties();
    prop.put("hibernate.format_sql", "true");
    prop.put("hibernate.show_sql", "true");
    prop.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

    return prop;
}

@Bean(name = "dataSource")
public BasicDataSource dataSource() {

    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/deneme_db2");
    ds.setUsername("root");
    ds.setPassword("xxxx");

    return ds;
}

@Bean
public HibernateTransactionManager txManger() {
    return new HibernateTransactionManager(sessionFactory());
}

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

}

PersonService.java

public interface PersonService {

public void addPerson(Person p);
public void updatePerson(Person p);
public List<Person> listPersons();
public Person getPersonById(int id);
public void removePerson(int id);

}

PersonServiceImpl.java

@Service("personService")
public class PersonServiceImpl implements PersonService {

private PersonDAO personDAO;

public void setPersonDAO(PersonDAO personDAO) {
    this.personDAO = personDAO;
}

@Override
@Transactional
public void addPerson(Person p) {
    this.personDAO.addPerson(p);
}

@Override
@Transactional
public void updatePerson(Person p) {
    this.personDAO.updatePerson(p);
}

@Override
@Transactional
public List<Person> listPersons() {
    return this.personDAO.listPersons();
}

@Override
@Transactional
public Person getPersonById(int id) {
    return this.personDAO.getPersonById(id);
}

@Override
@Transactional
public void removePerson(int id) {
    this.personDAO.removePerson(id);
}
}

PersonController.java

@Controller
public class PersonController {

private PersonService personService;

@Autowired(required = true)
@Qualifier(value = "personService")
public void setPersonService(PersonService ps) {
    this.personService = ps;
}

@RequestMapping(value = "/persons", method = RequestMethod.GET)
public String listPersons(Model model) {
    model.addAttribute("person", new Person());
    model.addAttribute("listPersons", this.personService.listPersons());
    return "person";
}

//For add and update person both
@RequestMapping(value = "/person/add", method = RequestMethod.POST)
public String addPerson(@ModelAttribute("person") Person p) {

    if(p.getId() == 0) {
        this.personService.addPerson(p);
    }else {
        this.personService.updatePerson(p);
    }
    return "redirect:/persons";
}

@RequestMapping(value = "/remove/{id}")
public String removePerson(@PathVariable("id") int id) {

    this.personService.removePerson(id);
    return "redirect:/persons";
}

@RequestMapping(value = "/edit/{id}")
public String editPerson(@PathVariable("id") int id, Model model) {
    model.addAttribute("person", this.personService.getPersonById(id));
    model.addAttribute("listPersons", this.personService.listPersons());
    return "person";
}
}

PersonDAO.java

public interface PersonDAO {

public void addPerson(Person p);
public void updatePerson(Person p);
public void removePerson(int id);
public List<Person> listPersons();
public Person getPersonById(int id);

}

PersonDAOImpl.java

@Component
public class PersonDAOImpl implements PersonDAO {

private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class);

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sf) {
    this.sessionFactory = sf;
}

@Override
public void addPerson(Person p) {
    Session session = this.sessionFactory.getCurrentSession();
    session.persist(p);
    logger.info("Person saved successfully, Person Details="+p);
}

@Override
public void updatePerson(Person p) {
    Session session = this.sessionFactory.getCurrentSession();
    session.update(p);
    logger.info("Person updated successfully, Person Details="+p);
}

@SuppressWarnings("unchecked")
@Override
public List<Person> listPersons() {
    Session session = this.sessionFactory.getCurrentSession();
    List<Person> personList = session.createQuery("from Person").list();
    for(Person p: personList) {
        logger.info("Person List::"+p);
    }
    return personList;
}

@Override
public Person getPersonById(int id) {
    Session session = this.sessionFactory.getCurrentSession();
    Person p = (Person) session.load(Person.class, new Integer(id));
    logger.info("Person loaded successfully, Person details="+p);
    return p;
}

@Override
public void removePerson(int id) {
    Session session = this.sessionFactory.getCurrentSession();
    Person p = (Person) session.load(Person.class, new Integer(id));
    if(null != p) {
        session.delete(p);
    }
    logger.info("Person deleted successfully, person details="+p);
}

}

更多例外

 exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

【问题讨论】:

    标签: java spring hibernate spring-mvc annotations


    【解决方案1】:

    您错过了包含 @Autowired 来注入依赖项。

    1) 在PersonServiceImpl:

    @Autowired
    private PersonDAO personDAO;
    

    2) 在PersonDAOImpl

    @Autowired
    private SessionFactory sessionFactory;
    

    最后,您需要在 Spring 配置类中使用 @EnableTransactionManagement 来启用事务管理:

    @EnableWebMvc
    @Configuration
    @EnableTransactionManagement
    @ComponentScan({ "com.ulotrix.spring" })
    public class AppConfig extends WebMvcConfigurerAdapter {
    

    【讨论】:

    • 我更改了这些并在 Intellih IDEA 中对项目结构进行了一些配置。现在我没有收到这个错误。但是这次当我尝试浏览http://localhost:8080/persons 页面时,我收到了HTTP Status 404 - /WEB-INF/views/person.jsp。但我在完全相同的位置有 person.jsp。
    • 如果文件存在,那么您将不会收到404 错误。尝试将文件导出为 WAR 文件,并查看 person.jsp 是否仍然存在于所需路径中。
    • 没有。只是库和类。为什么没有添加我的视图文件夹?
    • 好的,完成。我的 IDEA 设置坏了。我改变了这个并且它有效。谢谢。
    • 完美运行,感谢 Chaitanya!
    【解决方案2】:

    我认为你错过了private PersonDAO personDAO; 之前的@Autowired 注释。所以在这行return this.personDAO.listPersons();中是null

    【讨论】:

    • @ulotrix 可以加PersonDAO的代码吗?如果有更多异常,请查看您的服务器日志。
    • 您还必须在此处添加@Autowiredprivate PersonService personService
    • @ulotrix 你添加的不是 DAO。
    • 对不起,我的错。再次编辑。我也添加了@Autowired。
    • @ulotrix 我看不到道?!
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多