带有Spring3.1.0的Hibernate4.1无法在web应用程序中注册事件侦听器
在下面的线程中,讨论了如何使用spring在hibernate中注册事件侦听器: 我在线程中提到的文件中有我的Integrator,它正在注册事件侦听器带有Spring3.1.0的Hibernate4.1无法在web应用程序中注册事件侦听器,spring,hibernate,Spring,Hibernate,在下面的线程中,讨论了如何使用spring在hibernate中注册事件侦听器: 我在线程中提到的文件中有我的Integrator,它正在注册事件侦听器 META-INF/services/org.hibernate.integrator.spi.Integrator 当我在主程序(使用eclipse)中运行代码时,这很好。然而,当我在tomcat中将我的应用程序部署为war时,从未调用过Integrator。在tomcat内部,此文件位于以下位置: webapps/ROOT/META-IN
META-INF/services/org.hibernate.integrator.spi.Integrator
当我在主程序(使用eclipse)中运行代码时,这很好。然而,当我在tomcat中将我的应用程序部署为war时,从未调用过Integrator。在tomcat内部,此文件位于以下位置:
webapps/ROOT/META-INF/services/org.hibernate.integrator.spi.Integrator
谁能看一下吗
我尝试使用测试应用程序上下文运行JUnit测试用例来复制该场景,但在这里调用了Integrator
进一步调试时,注意到Hibernate中的以下代码正在添加积分器:
public IntegratorServiceImpl(LinkedHashSet<Integrator> providedIntegrators, ClassLoaderService classLoaderService) {
// register standard integrators. Envers and JPA, for example, need to be handled by discovery because in
// separate project/jars.
addIntegrator( new BeanValidationIntegrator() );
// register provided integrators
for ( Integrator integrator : providedIntegrators ) {
addIntegrator( integrator );
}
for ( Integrator integrator : classLoaderService.loadJavaServices( Integrator.class ) ) {
addIntegrator( integrator );
}
}
public IntegratorServiceImpl(LinkedHashSet提供的集成商、ClassLoaderService和ClassLoaderService){
//注册标准积分器。例如,Envers和JPA需要由discovery处理,因为在
//单独的项目/罐子。
加法器(新BeanValidationIntegrator());
//注册提供的集成商
用于(积分器积分器:提供的积分器){
加法器(积分器);
}
for(Integrator Integrator:classLoaderService.loadJavaServices(Integrator.class)){
加法器(积分器);
}
}
在这里面,classLoaderService.loadJavaServices(Integrator.class)在tomcat中部署应用程序时无法找到我的自定义Integrator,而它是在测试用例中或独立运行时找到的。现在,我使用了线程中提到的另一个想法,这是一种基于代码的方法:
@PostConstruct
public void registerListeners()
{
EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);
registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(listener);
}
不过,基于配置的方法会更有帮助。您是否将Web应用程序部署为根应用程序?如果将
org.hibernate.integrator.spi.integrator
放在$CATALINA_HOME/lib/META_INF/services
下会发生什么?如果将其放在webapps/ROOT/WEB-INF/classes/META-INF/services/org.hibernate.integrator.spi.integrator中会发生什么?是的,webapp被部署为ROOT,我尝试了$CATALINA_HOME/lib/META_INF/services和webapps/ROOT/WEB-INF/classes/META-INF/services/这两个选项。它们似乎不起作用。