2015-02-24 68 views
0

我有一個簡單的基於Spring MVC框架的庫項目。我要添加一個新的作者到我的作者表,但我得到NullPointerException。 我提供了與下面這個函數相關的添加類。誰能說有什麼不對?我在Spring MVC項目中遇到NullPointerException?

@Controller 
public class AuthorController { 

@RequestMapping("/addAuthor") 
protected ModelAndView addAuthor() throws Exception { 
    ModelAndView model = new ModelAndView("addAuthor"); 
    return model; 
} 

@RequestMapping("/addAuthorExecution") 
protected ModelAndView addAuthorExecution(
     @RequestParam("authorName") String authorName) throws Exception { 
    ApplicationContext cnx = new ClassPathXmlApplicationContext("spring.xml"); 
    AuthorService authorService = (AuthorService) cnx.getBean("authorService"); 
    authorService.addAuthor(authorName); 
    ModelAndView model = new ModelAndView("adminFunctionsPage"); 
    model.addObject("successMsg", "Your request has been processed Successfully."); 
    return model; 
} 
} 

服務類:

public class AuthorService { 
@Autowired 
Author author; 
@Autowired 
AuthorDAO authorDAO; 

public void addAuthor(String authorName) throws ClassNotFoundException, 
     SQLException { 
    AuthorDAO authorDAO = new AuthorDAO(); 
    authorDAO.addAuthor(authorName); 
} 
} 

DAO類:

public class AuthorDAO extends JdbcDaoSupport { 

public void addAuthor(String authorName) { 
    String sql = "insert into tbl_author (authorName) values (?)"; 
    this.getJdbcTemplate().update(sql, new Object[] { authorName }); 
} 


private static final class AuthorMapper implements RowMapper<Author> { 
    @Autowired 
    Author author; 

    @Override 
    public Author mapRow(ResultSet rs, int rowNum) throws SQLException { 
     author.setAuthorId(rs.getInt("authorId")); 
     author.setAuthorName(rs.getString("authorName")); 
     return author; 
    } 

} 
} 

模型類:

public class Author { 
int authorId; 
String authorName; 

public int getAuthorId() { 
    return authorId; 
} 

public void setAuthorId(int authorId) { 
    this.authorId = authorId; 
} 

public String getAuthorName() { 
    return authorName; 
} 

public void setAuthorName(String authorName) { 
    this.authorName = authorName; 
} 

} 

XML:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:annotation-config/> 
<context:component-scan base-package="com.hojat.LibSpringMVCProject.DAO" /> 
<context:component-scan base-package="com.hojat.LibSpringMVCProject.Service" /> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost/library"/> 
    <property name="username" value="root"/> 
    <property name="password" value="1234"/> 
</bean> 

<bean id="author" class="com.hojat.LibSpringMVCProject.model.Author"/> 


<bean id="authorDAO" class="com.hojat.LibSpringMVCProject.DAO.AuthorDAO" > 
    <property name="dataSource" ref="dataSource"/> 
</bean> 


<bean id="authorService" class="com.hojat.LibSpringMVCProject.service.AuthorService"/> 

錯誤:

'INFO: Loaded JDBC driver: com.mysql.jdbc.Driver 
Feb 24, 2015 1:16:11 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [spring-dispatcher] in context with path [/LibrarySpringMVCProject] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 
java.lang.NullPointerException 
    at com.hojat.LibSpringMVCProject.DAO.AuthorDAO.addAuthor(AuthorDAO.java:32) 
    at com.hojat.LibSpringMVCProject.service.AuthorService.addAuthor(AuthorService.java:40) 
    at com.hojat.LibSpringMVCProject.controller.AuthorController.addAuthorExecution(AuthorController.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:146) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:277) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source)' 
+0

錯誤在AuthorDAO的第32行。這條線是什麼?你推斷什麼?您不認爲行映射器應該爲每行創建一個新的作者,而不是每次調用它時都修改相同的(不)自動編寫的作者?另一方面,爲什麼要構建一個AuthorDAO,因爲你已經有一個,在服務中由Spring自動裝入? – 2015-02-24 18:36:19

+0

完成了。問題在於我的服務類中額外的AuthorDAO。感謝您的評論。 – Nisman 2015-02-24 18:48:29

回答

0

你好你可以試試

<property name="url" value="jdbc:mysql://localhost:3306/library"/> 

,而不是

<property name="url" value="jdbc:mysql://localhost/library"/> 

這將是問題。

0

幾次失誤

  1. 您自動裝配的POJO實體類Auther。這是錯誤的。
  2. 希望你對AuthorService
  3. @Service註釋您所創建的addAuthor方法裏面的AuthorDAO的對象。您應該注意AutherDAO不應該手動構建,因爲此類AutherDAO.AuthorMapper內有autowired對象。通過手動構建它們,這些自動佈線將不會連接到對象。

如果我完全重寫你的服務類,它會是這樣的。

@Service 
    public class AuthorService { 

     @Autowired 
     AuthorDAO authorDAO; 

     public void addAuthor(String authorName) throws Exception { 
      authorDAO.addAuthor(authorName); 
     } 
    } 
相關問題