【问题标题】:Autowired to hibernate Interceptor自动装配到休眠拦截器
【发布时间】:2014-02-02 13:10:44
【问题描述】:

我正在扩展 hibernate.EmptyInterceptor 并且在我的实现中我希望自动连接到一些服务,但它们返回 null。我在类上添加了一个 @Component 注释。我的代码:

<property name="jpaPropertyMap">
    <map>
        <entry key="javax.persistence.transactionType" value="JTA" />
        <entry key="hibernate.current_session_context_class" value="jta" />
        <entry key="hibernate.transaction.manager_lookup_class"
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
        <entry key="hibernate.connection.autocommit" value="false" />
        <entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>
    </map>
</property>

和班级:

@SuppressWarnings("serial")
@Component
public class AuditInterceptor extends EmptyInterceptor {

    @Autowired
    private IUserSessionService userSessionService;

【问题讨论】:

    标签: java spring hibernate interceptor


    【解决方案1】:

    我知道这可能来得太晚了两年 - 但我正在寻找相同问题的答案,并认为这对将来的某人有用。

    查看 Hibernate 代码,如果您给出类名,Hibernate 会实例化一个新的拦截器实例,但如果您传入一个 bean 实例引用,它将使用它。

    所以

    <bean id="myInterceptor" class="com.net.filter.AuditInterceptor" />
    

    ...

    <property name="jpaPropertyMap">
        <map>
            <entry key="javax.persistence.transactionType" value="JTA" />
            <entry key="hibernate.current_session_context_class" value="jta" />
            <entry key="hibernate.transaction.manager_lookup_class"
                value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
            <entry key="hibernate.connection.autocommit" value="false" />
            <entry key="hibernate.ejb.interceptor" >
                <ref bean="myInterceptor" />
            </entry>
        </map>
    </property>
    

    现在 bean myInterceptor 由 Spring 管理,自动装配将起作用!

    【讨论】:

      【解决方案2】:

      Spring 将永远不会@Autowired 目标保留为 null(除非您要注入的是 null)。这应该告诉您,如果 @Autowired 字段是 null,那么 Spring 与它无关。

      这里似乎是这样。通过提供类似的东西

      <entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>
      

      我相信您是在告诉 Hibernate 自己创建该实例,因此它不会是 Spring 托管的 bean。

      如果您发布 bean 定义的其余部分是因为我不知道您要注入什么 bean,那么可能还有其他选择。

      【讨论】:

      • 我正在尝试向我发布的课程注入服务。服务 (IUserSessionService) 为空。这个服务自动装配已经在不同的 bean 中工作了。
      • @lior 我想知道您上面发布的属性属于哪个bean。该 bean 不是使用您的 AuditInterceptor bean,而是实例化它自己的 bean,它不会由 spring 管理,因此不会处理任何注入目标。
      • 感谢您的帮助,但我在以下位置找到了解决方案:stackoverflow.com/questions/19217872/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多