Spring JPA / Hibernate EmptyInterceptor injiziert Entitymanager / Spring Beans nicht
Experten / Gurus / Freunde
Wir arbeiten mit der Kombination aus Spring 3.2, JPA 2 und Hibernate 4.2 und stellen uns diesem seltsamen Nullzeiger-Problem, während wir versuchen, mit Frühlingskommentaren versehene Beans in EmtyInterceptor zu injizieren, der wie unten dargestellt implementiert ist. Wir haben versucht, diese Bohne sowie eine Frühlingsbohne zu kommentieren, aber kein Glück.
Jede Hilfe zur Lösung dieses Rätsels hier wird sehr geschätzt.
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();
...
...
}
}
}
}
Überall sonst in der Anwendung wirkt die Injektion ohne Probleme wie ein Zauber. Hier ist unsere 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>
Und unsere spring-persistence.xml ist unten. Bitte beachten Sie, dass ich hier die Eigenschaft Emptyinceptor hinzugefügt habe.
<?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>
Lassen Sie mich Ihre wertvollen Gedanken / Tipps dazu wissen. Nochmals vielen Dank für Ihre Zeit, um diesen Beitrag zu lesen.
Auch ich habe den Beitrag gelesenInjizieren von JPAs Entity Manager in Hibernates EmptyInterceptor. Aber es sieht so aus, als würden sie manuell versuchen, die Bohne mit dem Namen zu finden, die aufgelöst werden soll, und ich glaube, es könnte einen anderen Weg geben.