我使用Hibernate的驗證(JSR 303)的奇怪行爲和註釋java.util.List類型JSR 303 - Hibernate的驗證4.2.0 - UnexpectedTypeException - @Valid和@Size組合
的下面的代碼基礎屬性:
public class A {
@Valid @NotNull @Size(min=1, max=15)
private List<B<?>> validList = new ArrayList<B<?>>();
...
}
如果我開始我得到下面的異常驗證:
javax.validation.UnexpectedTypeException: No validator could be found for type: B
at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:383)
at org.hibernate.validator.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:364)
at org.hibernate.validator.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:313)
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:144)
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117)
at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452)
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.validateCascadedConstraint(ValidatorImpl.java:613)
at org.hibernate.validator.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:478)
at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:322)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:139)
如果我改變我的代碼(並因此不幸的是我語義)如下:
public class A {
@Valid @NotNull @Size(min=0, max=15)
private List<B<?>> validList = new ArrayList<B<?>>();
...
}
一切都很好,沒有例外。
我錯過了哪個部分?有沒有人知道爲什麼這不起作用?
我已經找到了問題所在。我對B類定製約束
@CustomConstraint
public class B {
}
約束:
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CustomConstraintValidator.class)
@Documented
public @interface CustomConstraint {
String message() default "{com.mycompany.constraints.checkcase}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
和驗證:
public class CheckCaseValidator implements ConstraintValidator<CustomConstraint, B<? extends C>> {
... //validation stuff here
}
後我已刪除從驗證類仿製藥表達式:
public class CheckCaseValidator implements ConstraintValidator<CustomConstraint, B> {
... //validation stuff here
}
一切工作正常。
希望其他人覺得這有幫助。 此致 沃爾特
你確定這與'@ Size'有關嗎?對我來說,只有'@ Valid'存在時也會發生同樣的異常。 – jeha