我的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
答案 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