【问题标题】:Getting Hibernate Template object as null获取休眠模板对象为空
【发布时间】:2016-03-31 14:29:52
【问题描述】:

我正在开发一个 Spring Boot 应用程序。我想使用休眠模板。在我的 HibernateAdaptor 类中,我将 HibernateTemplate 对象设为空。看起来 Spring 无法注入 Hibernate 模板。我错过了什么吗?

以下是配置文件:

        <?xml version="1.0" encoding="UTF-8"?>  <beansxmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName"  value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="MyURL"></property>
        <property name="username" value="user"></property>
        <property name="password" value="pass!"></property>

    </bean><bean id="hibernate3AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <property name="dataSource" ref="dataSource"></property>        
        <property name="annotatedClasses">
    <list>
        <value>class1</value>
        <valueclass2</value>
</list>
</property>

        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop>  
                <prop key="hibernate.show_sql">true</prop> 
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop> 
                <prop key="format_sql">true</prop>  
            </props>  
        </property>  
    </bean>  

    **<bean id="hibernateAdapter"
        class="com.yoku.server.core.db.adapter.HibernateAdapter">
        <property name="template" ref="hibernateTemplate" />
    </bean>**

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="hibernate3AnnotatedSessionFactory"/>
    </bean>
    </beans>  

下面是类

package com.server.core.db.adapter;
import java.io.Serializable;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.yoku.server.infra.logger.ILogger;
import com.yoku.server.infra.logger.LoggerFactory;

public class HibernateAdapter<T> {

    HibernateTemplate template;

    public void setTemplate(HibernateTemplate template) {
        this.template = template;
    }
    private static final ILogger logger = LoggerFactory
            .getLogger(HibernateAdapter.class);

    public Object fetchByID(Class<T> entityClass, Serializable id) {

        logger.info("Template Object--------------------------" + template);
        return template.get(entityClass, id);
    }

}

得到以下异常:

INFO  c.y.s.c.s.product.ProductService - Template Object--------------------------null
Dec 25, 2015 10:10:02 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at com.server.core.db.adapter.HibernateAdapter.fetchByID(HibernateAdapter.java:33)
    at com.server.core.services.product.ProductService.getFashionProduct(ProductService.java:281)
    at com.server.core.services.product.ProductService.readProductDetails(ProductService.java:261)
    at com.server.rest.services.merchant.product.MerchantProductController.readproductDetails(MerchantProductController.java:125)
    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:776)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    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:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    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.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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:217)
    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:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
    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 应用程序上下文的实例。

标签: java mysql spring hibernate spring-boot


【解决方案1】:

确保您使用的是 HibernateAdapter 类的 Spring 托管实例。如果您自己实例化对象而不是使用 Spring 托管实例,那么 Spring 将不会/不能注入您的依赖项。

要获得更详细的响应,可能包括完整的错误消息和导致错误的代码示例(HibernateAdapter 类的用法)。

【讨论】:

  • HibernateAdapter adapter=new HibernateAdapter();产品 productFashion = (Product) adapter.fetchByID(Product.class, (Serializable)productId);此代码正在调用该方法。当我做 logger.info 时,我可以看到该模板对象为空。
  • 调用new 会创建您自己的类实例,而不是由 Spring 框架管理的实例。如果您不使用 Spring 托管对象,那么 Spring 将不会注入任何东西。在您进行new 调用的任何类中,改为定义该类的成员变量@Autowired HibernateAdapter hibernateAdapter,Spring 将注入配置中定义的类。使用@Autowired 注释对HibernateAdapter 构造函数进行注释,以注入属性文件中的HibernateTemplate
  • @turboemy 我已将此添加到我的服务类中:Autowired private HibernateAdapter hibernateAdapter;公共无效 setHibernateAdapter(HibernateAdapter hibernateAdapter) { this.hibernateAdapter = hibernateAdapter;这就是 Hibernate Adapter Class public class HibernateAdapter { Autowired HibernateTemplate hibernateTemplate;公共无效 setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate;现在将 hibernateAdapter 设为 Null
  • 你不应该有任何设置方法,因为你不想设置这些对象。你希望 Spring 注入它们。可能是 Spring 没有扫描您的类,将 context 命名空间和位置添加到 Spring 配置中,以及例如&lt;context:component-scan base-package="com.server.core" /&gt; 。这将告诉 Spring 扫描您的包中的注释。使用 @Service 注释在其主体中使用注释来注释任何类。您需要阅读一些文档和教程才能了解这里发生了什么,我不建议您盲目地按照我的说明进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多