2015-05-01 111 views
-1

我是Spring的新手,想要學習教程。我有一個問題。我轉換爲基於xml的配置到基於註釋的配置。 this是教程。Spring MVC「請求處理失敗」500錯誤

而且我收到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) 

回答

3

您錯過了包含@Autowired以注入依賴關係。

1)在PersonServiceImpl

@Autowired 
private PersonDAO personDAO; 

2)在:

@Autowired 
private SessionFactory sessionFactory; 

最後,你需要在你的Spring配置類使用@EnableTransactionManagement啓用事務管理:

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

我改變了這些,並在Intellih IDEA中關於Project Structure做了一些配置。現在我沒有收到這個錯誤。但是這次當我嘗試瀏覽'http:// localhost:8080/persons'頁面時,我收到'HTTP Status 404 -/WEB-INF/views/person.jsp'。但是我的person.jsp在完全相同的位置。 – fatiherdem

+0

如果該文件存在,那麼你將不會得到'404'錯誤。嘗試將該文件作爲WAR文件導出,並查看「person.jsp」是否仍然存在於所需的路徑中。 – Chaitanya

+0

不需要lib和classes。爲什麼不添加我的視圖文件夾? – fatiherdem

2

我想你private PersonDAO personDAO;之前錯過@Autowired註解。所以這一行是nullreturn this.personDAO.listPersons();

+0

我加了'@ Autowired',仍然得到相同的錯誤。 – fatiherdem

+0

@ulotrix是否可以添加'PersonDAO'的代碼?並查看您的服務器日誌是否有更多的例外情況。 – Jens

+0

我編輯了我的問題。你能再看一遍嗎? – fatiherdem

相關問題