在下面的线程中,讨论了如何使用 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 ) 无法找到我的自定义集成器,而它在测试用例中或在独立运行时找不到。