无法从Web应用程序类路径

时间:2017-07-18 12:19:50

标签: java spring hibernate

我的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构建BootstrapServiceRegistryBuilderresourcePatternResolver(可以查看Jars)
  • 当代码深入到ServiceLoader类时,它会尝试使用ClassLoader 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"); }

1 个答案:

答案 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