2017-07-18 27 views
0

我的Web應用程序與Spring 4.3/Hibernate 5.1緊密集成。無法從Web應用程序類路徑加載Jadira Hibernate模塊

我的主SessionFactory對象由延伸org.springframework.orm.hibernate5.LocalSessionFactoryBean的工廠處理。

在LSFB的afterPropertiesSet上,Hibernate掃描模塊和服務。

我目前得到以下錯誤,當Jadira jar文件是存在於網絡的classpath

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代碼。

  • LocalSessionFactoryBeanafterPropertiesSet使用默認MetadataSources
  • getMetadataSources調用的LocalSessionFactoryBuilder構造函數,調用時,第一次,建立一個BootstrapServiceRegistryBuilder使用的ClassLoader從resourcePatternResolver,這是WebappClassLoader(誰可以看看罐)
  • 當代碼挖入ServiceLoader類時,它嘗試使用ClassLoader實例化類org.jadira.usertype.dateandtime.joda.integrator.UserTypeJodaTimeHibernateIntegratororg.hibernate.boot.registry.cla[email protected]70d5297f
  • cod Ë分爲以下幾個行,我不能,儘管Java調試源

    try { 
         c = Class.forName(cn, false, loader); 
        } catch (ClassNotFoundException x) { 
         [OP: exception is swallowed] 
         fail(service, 
          "Provider " + cn + " not found"); 
        } 
    

我不明白爲什麼會這樣。 爲了加載Hibernate服務,有什麼特別的要做嗎?如何處理那些ServiceConfigurationError

+0

爲什麼需要繼承FactoryBean?有什麼特別的,你不能使用默認的'Factorybean'? –

+0

它用自定義機制覆蓋了休眠屬性。 –

+0

你爲什麼需要這個?您可以簡單地將其外化並設置屬性。我建議嘗試沒有你的子類(使用常規的'LocalSessionFactoryBean',看看問題是否仍然存在)。 –

回答

0

問題只是由於Java版本不匹配以及ServiceRegistry吞下了ClassNotFoundException。

它發生(I沒有提到),其Jadira 6.x的需要Java 8 /休眠5.2,但我使用Java 7.

CNFE的根本原因是UnsupportedClassVersionError這可以通過運行一個簡單main來獲得試圖實例化所需的服務類。在Java 8上運行應用程序有助於理解這一點(因爲錯誤是與HB 5.1的API不兼容),所以我只能將Jadira降級到5.x

相關問題