2

最近、JSR 303を使用してBeanを検証することにしました。しかし、私たちのプロジェクトでは、JUNIテストを実行すると、エラーが発生しました。ログは次のとおりです。

java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
    at javax.persistence.Persistence$1.isLoaded(Persistence.java:78)
    at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:61)
    at org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:131)
    at org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:46)
    at org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1242)
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:448)
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:397)
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:361)
    at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:313)
    at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:139)
    at com.icil.service.validator.BeanValidator.validate(BeanValidator.java:74)
    at com.icil.sofs.booking.model.ValidateTest.test1(ValidateTest.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

誰かが、これは競合するJARファイルが原因であると私に言いました。しかし、どのJARが競合しているかはわかりません。どのJARファイルが競合しているのか誰かに教えてもらえますか?どんな助けも私にとって大きなものです、ありがとう!!!

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

4

3 に答える 3

0

JARのリストがないと、ここであなたを助けるのは非常に困難です。プロジェクトにMavenがありますか?

その場合は、 `mvndependency:treeを使用してjarのツリーを確認できます。

JPA 2.0仕様に準拠していないHibernateを使用している可能性があります。ドキュメントに記載されているように、ProviderUtilクラスはJPA2.0で導入されました 。ProviderUtil

さらに別の懸念事項:スタンドアロンで実行していますか、それともコンテナ(アプリ/ウェブサーバーなど)内で実行していますか?たとえば、JBossを実行している場合、libフォルダーに独自のjarがあり、jarと衝突する可能性があります。JUnitテストをどの程度正確に実行していますか?

于 2012-06-28T05:01:35.523 に答える
0

私も同様の問題に直面していました。実際、HibernatePersistenceはエンティティjarにProviderUtil()メソッドを持っていませんでした。次の組み合わせがうまく機能します。

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.0.Final</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
 </dependency>

 <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.5.Final</version>
</dependency>
于 2013-10-07T14:50:32.980 に答える
0

検証の問題のみの場合は、JPATraversableResolverまたはDefaultTraversableResolverの代わりにTraversableResolverの独自の実装を使用することを検討してください。 方法は次のとおりです。

JPATraversableResolverは、JPAへの望ましくない依存関係を引き起こす可能性があります。同様の問題を抱えている人がいます。

もちろん、アプリケーションがJPA2に準拠していることを期待している場合、これは解決策ではありません。

public class MyTraversableResolver implements TraversableResolver {

     public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class rootBeanType, Path pathToTraversableObject, ElementType elementType) {
        return true;
     }

     public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class rootBeanType, Path pathToTraversableObject, ElementType elementType) {
        return true;
     }
}
于 2014-06-18T13:02:25.720 に答える