2011-11-03 5 views
2

에서 @Valid 및 @Size 내가 이상한 최대 절전 모드 검사기 (JSR 303)를 사용하여 행동과 코드베이스를 다음 java.util.List 타입JSR 303 - 최대 절전 모드 검증 4.2.0 - UnexpectedTypeException - 조합

의 속성을 주석을 :

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 

} 

모든 것이 잘 작동했습니다.

다른 사람들이 도움이되기를 바랍니다. 안부, 월터

+0

'@ Size'와 관련이 있습니까? 나에게도'@ Valid' 만 존재하는 경우에도 같은 예외가 발생합니다. – jeha

답변

1

javax.validation.ConstraintValidator<A, T>를위한 Javadoc (http://jcp.org/en/jsr/detail?id=303)는 말한다 :

주어진 객체 유형의 T. 위해 주어진 제약 조건 A를 검증하는 로직을 정의구현은 다음과 같은 제한 사항을 준수해야합니다

  • T가 아닌 파라미터 화 된 형태로 해결해야 T의
  • 또는 일반 매개 변수를 억제 할 와일드 카드 유형
해야
  1. (T는 해결해야

    이유가 ConstraintValidator<CustomConstraint, B> 인 경우

  2. (T의 또는 일반 매개 변수를 억제 할 와일드 카드 형식이어야 함)

    중 하나

나는 또한 자바 독의 different version을 발견 작동하지 않습니다 ConstraintValidator<CustomConstraint, B<?>>로, 작동하지 않는 것 곳 두 번째 제한은 빠져있다. 공식 javadoc이 잘못된 것일 수 있습니다. 호기심이 있다면 file a bug report for Hibernate Validator (참조 구현)입니다. 그렇지 않다면 - ;;)

관련 문제