【问题标题】:Spring MVC With Hibernate; nested exception is java.lang.NullPointerException When getCurrentSession()带有休眠的 Spring MVC;嵌套异常是 java.lang.NullPointerException 当 getCurrentSession()
【发布时间】:2016-04-19 12:59:14
【问题描述】:

我收到此错误严重:Servlet.service() for servlet [appServlet] in context with path [/org] throw exception [Request processing failed;嵌套异常是 java.lang.NullPointerException] 的根本原因

java.lang.NullPointerException
    at com.aquicktrack.controller.RegistrationDao.insertCustomer(RegistrationDao.java:31)
    at com.aquicktrack.org.StratUpController.getRegistration(StratUpController.java:32)
    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.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    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:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    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)

我的 Spring 配置文件

<!-- JDBC Data Source. It is assumed you have MySQL running on localhost 
        port 3306 with username root and blank password. Change below if it's not 
        the case -->
    <bean id="myDataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/study" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="validationQuery" value="SELECT 1" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.aquicktrack.com.entities" />
        <property name="hibernateProperties">
            <props>

                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>

    <!-- Hibernate Transaction Manager -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- Activates annotation based transaction management -->
    <tx:annotation-driven transaction-manager="transactionManager" />

和我的 Java 代码

@Autowired
    private SessionFactory sessionFactory;
    /**
     * Simply selects the home view to render by returning its name.
     */
    @Transactional
    public void insertCustomer()
    {
        Registration registration = new Registration();
        registration.setFullname("Ashish Srivastava");
        registration.setEmail("Ashish");
        registration.setIsRegister("0");
        registration.setPhone("xxxxxxxxxx");
        registration.setStatus("0");
        registration.setTime("1234567890");
        registration.setVehicle("12");
        Session session = this.sessionFactory.getCurrentSession();
        session.persist(registration);
        logger.info("Person saved successfully, Registration Details="+registration);
    }

当我想从会话工厂类中获取当前会话时,它会抛出它

【问题讨论】:

  • 这个Session session = this.sessionFactory.getCurrentSession();
  • SessionFactory注入是否正确?
  • 实际上我是 Spring MVC 和 Hibernate 的新手,我不知道如何在控制台中执行此操作 Hibernate 使用我的实体类创建数据库正确运行
  • 让我猜猜你在控制器中使用 new RegistrationDao() 而不是使用 spring 托管实例。
  • 是的,我正在创建此类的一个实例并使用对象调用该方法

标签: java spring hibernate maven spring-mvc


【解决方案1】:

根据cmets:

让我猜你的控制器是用 new RegistrationDao() 代替 使用spring托管实例。 – M. Deinum


是的,我正在创建此类的一个实例并使用以下方法调用该方法 对象 – Ashish Srivastava


问题是 Spring 只会注入 Spring Managed Beans*。当您使用 new 创建对象时,它不是 Spring Managed Bean!

所以在你的DAO中添加@Repository注解,并通过添加一个带有@Autowird注解的文件让DAO注入你的控制器,然后使用它来代替new DAO

@Repository
public class YourDAO{
    @Autowired
    private SessionFactory sessionFactory;
    ...

    @Transactional
    public void insertCustomer(){...}
}

@Controller
public class YourController{
    @Autowired
    private YourDao yourDao;

    ... {
       this.yourDao.insertCustomer();
    }
}

*Except when @Configurable is used

【讨论】:

  • 出现此错误无法自动装配字段:com.aquicktrack.controller.RegistrationDao com.aquicktrack.org.StratUpController.registrationdoa;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [com.aquicktrack.controller.RegistrationDao] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
  • 你需要配置Spring,它的组件扫描也会扫描包含YourDAO的包。
  • 它转到下一步但现在我收到此错误 HTTP 状态 500 - 请求处理失败;嵌套异常是 org.hibernate.HibernateException: No Session found for current thread
  • 新问题,新问题:这和这个问题已经没有关系了,所以请新的问题,并发布相关代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2014-08-08
  • 1970-01-01
  • 2011-12-24
  • 2015-11-12
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多