我的Web应用程序与Spring 4.3 / Hibernate 5.1紧密集成。
我的主SessionFactory
对象由扩展org.springframework.orm.hibernate5.LocalSessionFactoryBean
的工厂处理。
在LSFB的afterPropertiesSet
上,Hibernate会扫描模块和服务。
当Web类路径中存在Jadira jar文件时,我当前收到以下错误
Caused by: java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.jadira.usertype.dateandtime.joda.integrator.UserTypeJodaTimeHibernateIntegrator not found
at java.util.ServiceLoader.fail(ServiceLoader.java:231)
at java.util.ServiceLoader.access$300(ServiceLoader.java:181)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:365)
at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:340)
at org.hibernate.integrator.internal.IntegratorServiceImpl.<init>(IntegratorServiceImpl.java:40)
at org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:213)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.getMetadataSources(LocalSessionFactoryBean.java:364)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:399)
at com.acme.AnnotationSessionFactoryBean.afterPropertiesSet(AnnotationSessionFactoryBean.java:203)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 35 more
我正在调查此事。看起来有一个类加载器问题,因为我还无法理解。
我一直在深入研究Spring和Hibernate代码。
LocalSessionFactoryBean
的{{1}}使用默认afterPropertiesSet
LocalSessionFactoryBuilder
的构造函数
MetadataSources
,第一次调用时,使用getMetadataSources
中的ClassLoader构建BootstrapServiceRegistryBuilder
,resourcePatternResolver
(可以查看Jars)WebappClassLoader
实例化类org.jadira.usertype.dateandtime.joda.integrator.UserTypeJodaTimeHibernateIntegrator
代码分为以下几行,尽管有Java源代码我无法调试
org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader@70d5297f
我不明白为什么会这样。
有没有什么特别的事情要加载Hibernate服务?如何处理那些 try {
c = Class.forName(cn, false, loader);
} catch (ClassNotFoundException x) {
[OP: exception is swallowed]
fail(service,
"Provider " + cn + " not found");
}
?
答案 0 :(得分:0)
问题仅仅是由于Java版本不匹配以及ServiceRegistry吞下了ClassNotFoundException。
发生(我没有提到)Jadira 6.x需要Java 8 / Hibernate 5.2,但我使用的是Java 7。
CNFE
的根本原因是UnsupportedClassVersionError
,可以通过运行一个简单的main
来尝试实例化所需的服务类来获得。在Java 8上运行应用程序有助于理解这一点(因为错误是与HB 5.1不兼容的API),因此我只需将Jadira降级为5.x