Spring JPA/Hibernate EmptyInterceptor 不注入 Entitymanager/Spring beans

2023-12-08

专家/大师/朋友

我们正在使用 Spring 3.2、JPA 2、Hibernate 4.2 组合,并在尝试将任何带有 Spring 注解的 bean 注入到实现如下所示的 EmtyInterceptor 时面临这个奇怪的空指针问题。我们尝试过注释这个 bean 以及 spring bean,但没有成功。

非常感谢任何帮助解决这个难题的人。

import javax.inject.Inject;
import javax.inject.Named;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.springframework.transaction.annotation.Transactional;
...

@Named
@Transactional
public class AuditEmptyInterceptor extends EmptyInterceptor {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    // Didnt inject - Null
    @PersistenceContext
    private EntityManager entityManager;

    // Didnt inject - Null
    //@PersistenceUnit
    //private EntityManagerFactory entityManagerFactory;

    // Didnt inject - Null
    //@Inject
    //private AuditHelper auditHelper;

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] currentState,
            String[] propertyNames, Type[] types) {

        System.out.println("**********inside OnSave() in Audit Empty Interceptor******************");
        if(entity instanceof xxAuditInterface || entity instanceof xxxCompBranchInterface){
            for (int i = 0; i < propertyNames.length; i++) {
         ...
         ...
         // Null entityManager - NPE here
        javax.persistence.Query query = entityManager.createQuery("Select c From CompanyDO c Where c.companyName =:companyName");
        query.setParameter("companyName", xxx);
        CompanyMasterDO companyMasterDO = (CompanyMasterDO) query.getSingleResult();
         ...
         ...
          }
         }
        }

 }

在应用程序的其他地方,注入就像魅力一样,没有任何问题。 这是我们的 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" 
xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" 
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">


<context:annotation-config></context:annotation-config> 

<context:component-scan base-package="com" />

<context:property-placeholder location="classpath*:hibernate.properties" />
<tx:annotation-driven />

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

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost/rcent_rel_2"
    p:username="root" p:password="root" />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="persistenceXmlLocation" value="classpath*:META-INF/spring-persistence.xml" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />

<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="MYSQL" 
    p:showSql="false" 
    p:databasePlatform="org.hibernate.dialect.MySQL5Dialect"/>

<\beans>

我们的 spring-persistence.xml 如下。请注意,我在这里添加了 Emptyinceptor 属性。

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
<persistence-unit name="xxx" transaction-type="RESOURCE_LOCAL">
    <class>com.xxx</class>
         ...
         ...
    <properties>
           <property name="hibernate.ejb.interceptor"
                       value="com.company.demo.audit.AuditEmptyInterceptor" />           
    </properties>
    </persistence-unit>
</persistence>

让我知道您对此的宝贵想法/提示。再次感谢您花时间阅读这篇文章。

我也读过这篇文章在Hibernate的EmptyInterceptor中注入JPA的实体管理器。但看起来他们正在手动尝试找到具有名称的 bean 来解析,我觉得可能还有其他方法。


The AuditEmptyInterceptor不是 Spring 管理的 bean,它是由 Hibernate 实例化的,因此您无法向其中注入依赖项。

您可以使用静态委托来代替:

public class StaticDelegateInterceptor extends EmptyInterceptor {

    private static Interceptor interceptor; 

    public static void setInterceptor(Interceptor interceptor) {
        StaticDelegate.interceptor = interceptor;
    }

    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
      return StaticDelegate.interceptor.onSave(entity, id, state, propertyNames, types);
    }
    ...
}

注册 StaticDelegateInterceptorpersistence.xml

<persistence>
    <persistence-unit name="xxx" transaction-type="RESOURCE_LOCAL">
       <class>com.xxx</class>
       ...
       ...
       <properties>
          <property name="hibernate.ejb.interceptor"
                   value="com.company.demo.audit.StaticDelegateInterceptor" />           
       </properties>
   </persistence-unit>
</persistence>

修改当前的 AuditEmptyInterceptor 以便它向 StaticDelegateInterceptor 注册自身:

@Named
@Transactional
public class AuditEmptyInterceptor extends EmptyInterceptor {  

     @PostConstruct
     public void init() {
          StaticDelagateInterceptor.setInterceptor(this);
     }
     ...
}

最后确保你的entityManagerFactory豆取决于你的auditEmptyInterceptor通过设置depends-on属性:

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter"
depends-on="auditEmptyInterceptor" >
...
</bean>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring JPA/Hibernate EmptyInterceptor 不注入 Entitymanager/Spring beans 的相关文章

随机推荐

  • 可以使用自闭合 DIV 标签吗? [复制]

    这个问题在这里已经有答案了 可能的重复 自关闭标签在 HTML5 中有效吗 例如 div div 然后将使用 Javascript 来填充此 div 这是有效的 HTML 吗 不 HTML 4 x 没有任何自闭合标签的概念 它在 XHTML
  • 翻转滚动条 WPF

    你好 我正在构建一个显示从 0 到最大值的标尺的控件 0 值位于底部 最大值位于高于 0 的 y 值 最大值在我们滚动到它之前不可见 问题是 当0向下时 最大值向上 滚动条的0值向上 最大值向下 我希望滚动条能够翻转 我怎样才能做到这一点
  • 如何在 AngularFire 0.5.0 中从 .$on('loaded') 访问加载的数据

    我在 AngularFire 0 5 0 中使用 on 方法访问从 firebase 加载的数据时遇到问题 在回调中 当我注销范围的内容时 数据就在那里 但是当我尝试使用更深层次的数据时 我得到了undefined 也许我误解了您如何用这种
  • Bokeh 中的日期时间轴

    对于我的图 我想在散景中使用 日期时间 选项 如下所示 top figure width 900 height 500 x axis type datetime 我的 x 轴数据采用 datetime time 格式 x time date
  • Python Tkinter 可滚动框架类?

    我想做一个Tkinter class 基于答案在这里 这是一个Frame自动显示 隐藏Scrollbar根据需要围绕内容 我上面链接的答案非常适合我的需求 但需要注意的是 因为它不包含在class 它不可重复使用 我认为这会非常快速和简单
  • 在今天的特定小时和分钟创建 NSDate

    我怎样才能创建一个NSDate今天的日期和小时 分钟和秒分别为 5 0 和 0 IE 日期将为 07 02 2010 05 00 00 Gives us the current date NSCalendar gregorian NSCal
  • jplayer在一页中显示多个mp3文件链接

    我在页面中使用 jplayer 当单击链接时我想播放单击的链接 但是每次播放 test1 mp3 时 我该如何解决 代码如下 如果需要的话页面如下 http www dilyurdu com audio htm function liste
  • desc 附近的 SQL 语法错误 [重复]

    这个问题在这里已经有答案了 我得到的错误是 com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解使
  • Codeigniter 中的选择框验证

    我是 Codeigniter 的新手 在选择框验证方面遇到一些问题 我想要在开始时默认选择值
  • 由于规范中的日期格式,gemspec 无效

    当我在 Gemfile 中包含我制作的 gem 时 感谢 Bundler 版本 1 0 12 然后我尝试像这样捆绑或 rake rake 我收到此错误消息 Invalid gemspec in Users zagzag rvm gems r
  • 顺利地将对象移动到目的地 Unity3D

    我一整天都在尝试从point A to point B顺利 所以我尝试了Lerp 朝着去 and 平滑阻尼但每次物体都会从A点消失并立即出现在B点 我尝试了在互联网上找到的所有解决方案 但得到了相同的结果 你能救我一命并帮我解决这个问题吗
  • 您的 Ruby 版本是 2.1.0,但您的 Gemfile 指定为 2.0.0

    在我的 Gemfile 中 我指定了 ruby 版本 2 0 0 ruby 2 0 0 但我的控制台告诉我我有 2 1 0dev ruby v ruby 2 1 0dev 2013 09 16 trunk 42951 x86 64 darw
  • 如何存储具有数十亿个节点和顶点的大型有向未加权图

    图的大小为数十亿个节点和数百亿个顶点 它将存储网页 URL 以及网页之间的链接 并将用于测试排名算法 任何语言都可以 但java是首选 到目前为止我找到的解决方案 neo4j 存储在排序的平面文件中 是的 我已经读过存储 访问有向图的最佳方
  • Ada 95:修改字典程序的输出

    我找到了这本词典作者 William Whitaker 在互联网上 我喜欢它的解析能力 但输出不适合我 问题 对我来说是挑战 给定输入形式 例如 audiam 程序将返回以下输出 纯文本 audi am V 4 1 PRES ACTIVE
  • 随机数生成器性能因平台而异

    我正在测试 C 中随机数生成器的性能 并发现了一些我不明白的非常奇怪的结果 我已经测试了 std rand 与使用 std minstd rand 的 std uniform real distribution std rand 计时代码
  • Android - 三星:使用配置活动创建小部件失败

    我构建了一个可以将小部件添加到主屏幕的应用程序 该小部件可与我的 Nexus 6P 和摩托罗拉 Moto G3 配合使用 对于三星手机 使用 S3 mini 4 1 2 S5 S6 6 0 1 进行测试 小部件根本不会添加 或者 Touch
  • 使用 Apache Kafka Streaming 解析 JSON 数据

    我有一个从 Kafka 主题读取 JSON 数据的场景 通过使用 Kafka 0 11 版本 我需要编写 Java 代码来流式传输 Kafka 主题中存在的 JSON 数据 我的输入是包含字典数组的 Json 数据 现在我的要求是获取 文本
  • 如何在 Swift 中使用名称为关键字的 Objective-C 类

    我们正在尝试使用 BZObjectStore 库 https github com expensegasprices BZObjectStore 在我们的 Swift 项目中 但在这个库中 他们使用 where 作为名称来设置查询条件 BZ
  • 如何取回以二进制形式存储在数据库中的java UUID

    我们有一个 Java UUID 字段 经过以下转换后以二进制字节形式存储在数据库 MySQL 中 private byte getUUIDtoBytes UUID devId byte uuidBytes new byte 16 ByteB
  • Spring JPA/Hibernate EmptyInterceptor 不注入 Entitymanager/Spring beans

    专家 大师 朋友 我们正在使用 Spring 3 2 JPA 2 Hibernate 4 2 组合 并在尝试将任何带有 Spring 注解的 bean 注入到实现如下所示的 EmtyInterceptor 时面临这个奇怪的空指针问题 我们尝