抛出AbstractMethodError

时间:2015-11-14 22:14:44

标签: java hibernate bean-validation

我的Spring 3.1.1.RELEASE / Hibernate 3.6.2-Final对一些类字段使用Joda DateTime数据类型,一切都很好。

Hibernate 4x和5x使用Jadira作为Joda for DateTimes的前端。

Hibernate-validator 5x引入了javax.validation 1.1.0.Final,它有一个我想要使用的新方法。

Jadira尚未与Hibernate 5x配合使用,所以4x是最新的。

部分pom:

<!-- adds joda-time , joda-money and JDK types for hibernate4 -->
<dependency>   <!-- jadira is not yet compatible with hibernate 5 -->
  <groupId>org.jadira.usertype</groupId>
  <artifactId>usertype.core</artifactId>
  <version>4.0.0.GA</version>
</dependency>

<!-- JSR 303 validation -->
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <!-- <version>1.0.0.GA</version>     brought in by hibernate 4x which I dont want -->
  <version>1.1.0.Final</version>  <!-- brought in by hibernate 5x which I do   want -->
</dependency>

 <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>4.3.2-Final</version>
   <exclusions>
     <exclusion>
       <groupId>javax.validation</groupId>
       <artifactId>validation-api</artifactId>
     </exclusion>
   </exclusions>
 </dependency>

查看我的依赖树...

+- javax.validation:validation-api:jar:1.1.0.Final:compile
+- org.jadira.usertype:usertype.core:jar:4.0.0.GA:compile
|  +- (org.hibernate:hibernate-entitymanager:jar:4.3.8.Final:compile - omitted for conflict with 4.3.2.Final)
|  +- org.slf4j:slf4j-api:jar:1.7.12:compile
|  \- org.jadira.usertype:usertype.spi:jar:4.0.0.GA:compile
|     \- (org.slf4j:slf4j-api:jar:1.7.12:compile - omitted for duplicate)
+- org.hibernate:hibernate-validator:jar:4.3.2.Final:compile
+- org.hibernate:hibernate-entitymanager:jar:4.3.2.Final:compile
|  +- (org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile - omitted for conflict with 3.3.0.Final)
|  +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile
|  +- org.hibernate:hibernate-core:jar:4.3.2.Final:compile
|  |  +- (org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile - omitted for conflict with 3.3.0.Final)
|  |  +- (org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile - omitted for duplicate)
|  |  +- (org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile - omitted for duplicate)
|  |  +- (dom4j:dom4j:jar:1.6.1:compile - omitted for duplicate)
|  |  +- (org.hibernate.common:hibernate-commons-annotations:jar:4.0.4.Final:compile - omitted for duplicate)
|  |  +- (org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile - omitted for duplicate)
|  |  +- (org.javassist:javassist:jar:3.18.1-GA:compile - omitted for duplicate)
|  |  +- antlr:antlr:jar:2.7.7:compile
|  |  \- org.jboss:jandex:jar:1.1.0.Final:compile
|  +- dom4j:dom4j:jar:1.6.1:compile
|  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
|  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.4.Final:compile
|  |  +- (org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile - omitted for conflict with 3.3.0.Final)
|  |  \- (org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile - omitted for duplicate)
|  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
|  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile
|  \- org.javassist:javassist:jar:3.18.1-GA:compile

树中的其他任何地方都没有javax.validation:validation-api被引用但在显示的那一行上。在(Eclipse)IDE中,我会收到新方法的提示,告诉我它指向正确的版本(1.1.0.Final)

所以我已经通过升级到Spring 4.1.1.RELEASE和Hibernate 4.3.2-Final进行了战斗,并使AFAICT再次运行。所以我开始做一些bean验证......

Set<ConstraintViolation<Permit>> violations = validator.validate( permit);
if( !violations.isEmpty()) {
    logger.debug( "basic validation FAILED with " + violations.size() + " errors");
    Iterator<ConstraintViolation<Permit>> iter = violations.iterator();
    while( iter.hasNext()) {
        ConstraintViolation<Permit> cv = iter.next();

        logger.debug( "invalidValue:" + cv.getInvalidValue());
        logger.debug( "message:" + cv.getMessage());
        ConstraintDescriptor<?> cd = cv.getConstraintDescriptor();
        Map<String, Object> mapp = cd.getAttributes();
        for( String keey : mapp.keySet()) {
            logger.debug("mapp key:" + keey + ":" + mapp.get(keey));
        }
        Annotation kkk = cd.getAnnotation();
        ConstraintTarget ct = null;
        if( cd.getValidationAppliesTo() == null) {   //  <-- throws AbstractMethodError 

但我正在使用的新方法抛出运行时AbstractMethod错误......

Exception in thread "main" java.lang.AbstractMethodError: org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.getValidationAppliesTo()Ljavax/validation/ConstraintTarget;

有关如何跟踪此问题的任何想法?

TIA,

Still-learning Stev

1 个答案:

答案 0 :(得分:0)

我认为问题与hibernate版本有关,Hibernate 4.x是javax.validation 1.0(JSR-303)的实现,如果你想使用1.1(javax.validation),你必须升级到hibernate 5 .X

<强>更新

请参阅此问题:AbstractMethodError on deploying Spring 4.0 in Tomcat 6

相关问题