2017-07-18 2 views
0

私のWebアプリケーションはSpring 4.3/Hibernate 5.1と緊密に統合されています。WebアプリケーションクラスパスからJadira Hibernateモジュールをロードできません

私のメインのSessionFactoryオブジェクトは、org.springframework.orm.hibernate5.LocalSessionFactoryBeanに拡張された工場で処理されます。

LSFBのafterPropertiesSetでは、Hibernateがモジュールとサービスをスキャンします。

Jadira jarファイルが、私は今、これを調査していたWebクラスパス

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のコンストラクタを呼び出し、WebappClassLoaderあるresourcePatternResolverからのクラスローダ、(誰が瓶の中に見ることができる)
  • を使用して BootstrapServiceRegistryBuilderを構築
  • コードがServiceLoaderクラスに入ると、ClassLoaderを使用してクラスorg.jadira.usertype.dateandtime.joda.integrator.UserTypeJodaTimeHibernateIntegratorをインスタンス化しようとします。org.hibernate.boot.registry.cla[email protected]70d5297f
  • これがなぜ起こるか私はJavaソース

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

にもかかわらず、デバッグすることはできません次の行にEブレークは、私は理解していません。 Hibernateサービスをロードするために特に必要なことはありますか?どのようにそれらを扱うことができますServiceConfigurationError

+0

なぜ「FactoryBean」をサブクラス化する必要がありますか?あなたはデフォルトの 'Factorybean'で作業できないほど特別なものは何ですか? –

+0

カスタムメカニズムを使用して、ハイバネートプロパティをオーバーライドします。 –

+0

なぜそれが必要でしょうか?それを外部化してプロパティを設定することができます。あなたのサブクラスなしで試してみることをお勧めします(通常の 'LocalSessionFactoryBean'を使用し、問題がまだ存在するかどうか確認してください)。 –

答えて

0

この問題はJavaバージョンの不一致とServiceRegistryによってClassNotFoundExceptionが飲み込まれたことが原因でした。

Jadira 6.xはJavaの8/Hibernateは5.2が必要であることを(私は言及しなかった)が起こるが、私は、Java 7に

を使用していますCNFEの根本的な原因は、単純なmainを実行することによって得ることができるUnsupportedClassVersionErrorです目的のサービスクラスをインスタンス化しようとしています。 Java 8でアプリケーションを実行すると、これが理解できます(エラーはHB 5.1とのAPIの非互換性です)ので、Jadiraを5.xにダウングレードする必要がありました。

関連する問題