java - Spring + mybatis = java.lang.NullPointerException

标签 java spring mybatis

我对 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/

相关文章:

java - 在其他操作系统上存储文件时 AppData (Windows) 的替代方案

mysql - SpringBoot-MyBatis-MySQL中如何使用SelectById(object_id)获取特定对象?

java - Mybatis中如何正确使用<foreach>语句

spring - 如何部署 swagger 生成的 spring 代码(Tomcat)

java - 第一次运行 MyBatis 报错信息

java - Finalize block 的问题

java - Eclipse插件开发: How to inform view that content has changed?

java - 按列打印二维字符串数组

spring - 使用mockmvc和junit添加csrf token

java - SpringMVC跨服务器上传文件Handler调度失败;嵌套异常是 java.lang.NoClassDefFoundError : javax/ws/rs/ext/Providers