私の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のコードを掘り下げています。
LocalSessionFactoryBean
のafterPropertiesSet
デフォルトMetadataSources
初めて呼び出さgetMetadataSources
を、使用してLocalSessionFactoryBuilder
のコンストラクタを呼び出し、WebappClassLoader
あるresourcePatternResolver
からのクラスローダ、(誰が瓶の中に見ることができる) を使用して
- コードが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"); }
BootstrapServiceRegistryBuilder
を構築
にもかかわらず、デバッグすることはできません次の行にEブレークは、私は理解していません。 Hibernateサービスをロードするために特に必要なことはありますか?どのようにそれらを扱うことができますServiceConfigurationError
?
なぜ「FactoryBean」をサブクラス化する必要がありますか?あなたはデフォルトの 'Factorybean'で作業できないほど特別なものは何ですか? –
カスタムメカニズムを使用して、ハイバネートプロパティをオーバーライドします。 –
なぜそれが必要でしょうか?それを外部化してプロパティを設定することができます。あなたのサブクラスなしで試してみることをお勧めします(通常の 'LocalSessionFactoryBean'を使用し、問題がまだ存在するかどうか確認してください)。 –