0

在下面的线程中,讨论了如何使用 spring 在 hibernate 中注册事件侦听器: eventlisteners using hibernate 4.0 with spring 3.1.0.release?

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

META-INF/services/org.hibernate.integrator.spi.Integrator

当我在主程序(使用 Eclipse)中运行代码时,这可以正常工作。但是,当我在 tomcat 中将应用程序部署为战争时,集成器永远不会被调用。在 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 );
    }
}

在这里面,当我的应用程序部署在 tomcat 中时,classLoaderService.loadJavaServices( Integrator.class ) 无法找到我的自定义集成器,而它在测试用例中或在独立运行时找不到。

4

1 回答 1

1

现在,我使用了线程中提到的另一个想法,它是一种基于代码的方法:

@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);
}

但是,基于配置的方法会更有帮助。

于 2013-04-05T09:21:31.177 回答