2015-02-24 66 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); 
     } 
    } 
相关问题