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>