带有Spring3.1.0的Hibernate4.1无法在web应用程序中注册事件侦听器

带有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

在下面的线程中,讨论了如何使用spring在hibernate中注册事件侦听器:

我在线程中提到的文件中有我的Integrator,它正在注册事件侦听器

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/这两个选项。它们似乎不起作用。