我对 Spring 和 mybatis 非常陌生,所以我确信我在这里做错了不止一件事。当我调用 getWorkbasketResponse() 时,我收到 NPE。你能帮我一下吗?
@Controller
public class MySubscribeController {
private static final Logger logger = LoggerFactory.getLogger(MySubscribeController.class);
@RequestMapping(value = "/workbasket/subscribe", method = RequestMethod.POST)
public @ResponseBody String subWorkBasket(@RequestBody WorkbasketRequest subWorkbasket) {
logger.info("Workbasket");
//new FuseboxPush(subWorkbasket);
MyDAO dao = new MyDAO();
dao.getWorkbasketResponse();
return "{result:\"true\"}";
}
}
这是我的 DAO
public class MyDAO {
private static final Logger logger = LoggerFactory.getLogger(MyDAO.class);
private SqlSessionFactory sqlSessionFactory;
public MyDAO() { }
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public WorkbasketResponse getWorkbasketResponse() {
WorkbasketResponse response = null;
try {
SqlSession session = sqlSessionFactory.openSession();
try {
response = (WorkbasketResponse)session.selectOne("com.fmr.myapp.domain.response.WorkbasketResponse.getWorkbasketResponse");
}
catch(Exception e) {
logger.error(e.getMessage());
}
finally {
session.close();
}
}
catch(Exception e) {
e.printStackTrace();
//Thorws java.lang.NullPointerException !!
}
return response;
}
}
这是我的 root-context.xml 的样子
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:derby://someserver:1527/myapp;create=true;user=derbyuser;password=derbyuser"/>
<property name='driverClassName' value='org.apache.derby.jdbc.ClientDriver'/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="myDAO" class="com.fmr.myapp.service.MyDAO">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC '-//mybatis.org//DTD Config 3.0//EN'
'http://mybatis.org/dtd/mybatis-3-config.dtd'>
<configuration>
<environments default='development'>
<environment id='development'>
<transactionManager type='JDBC'/>
<dataSource type='POOLED'>
<property name='driver' value='org.apache.derby.jdbc.ClientDriver'/>
<property name='url' value='jdbc:derby://someserver:1527/myapp;create=true;user=derbyuser;password=derbyuser'/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="myappMapper.xml"/>
</mappers>
</configuration>
我遇到的异常
java.lang.NullPointerException
at com.fmr.myapp.service.MyDAO.getWorkbasketResponse(MyDAO.java:26)
at com.fmr.myapp.controllers.MySubscribeController.subWorkBasket(MySubscribeController.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1686)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
最佳答案
代码MyDAO dao = new MyDAO();
不正确,因为它没有设置在root-context.xml中声明的 session 引用.
MyDao bean需要使用@AutoWired
注解,请查看下面的示例:
@Controller
public class MySubscribeController {
private static final Logger logger = LoggerFactory.getLogger(MySubscribeController.class);
@AutoWired
MyDAO dao;
@RequestMapping(value = "/workbasket/subscribe", method = RequestMethod.POST)
public @ResponseBody String subWorkBasket(@RequestBody WorkbasketRequest subWorkbasket) {
logger.info("Workbasket");
//new FuseboxPush(subWorkbasket);
dao.getWorkbasketResponse();
return "{result:\"true\"}";
}
}
关于java - Spring + mybatis = java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834575/