2012-02-17 6 views
0

클래스 수준 주석 제한을 사용하고 싶습니다. 그러나 자동으로 유효성을 검사하는 내부 제약 조건을 얻을 수 없습니다. 이 기술에 유효성 검사 그룹을 통합하기 위해 한 가지 도움을 드리고자합니다.중첩 된 Jsr 303 유효성 검사 주석

@ConstraintA({ 
    @ConstraintB(stuff), 
    @ConstraintB(stuff, groups=SomeGroup.class) 
}) 
public class Form{ 
} 

나는 이와 같이 제약 조건을 트리거합니다.

if(constraint instanceof ConstraintB){ 
     new ConstraintBValidator().isValid(target, context); 
} 

그러나 이것은 명백히 우리 결국 AnnotationInvocationHandler.invoke() 메소드에 대한 호출을 통해 isValid 방법을 트리거 리팩토링, 여전히와는 조금 메신저 것이다 흡입.

내 문제는 모든 ConstraintB 인스턴스가 내 ConstraintA로 전달된다는 것입니다. 적절한 그룹이있는 사람 만 ConstraintA에 전달되기를 바랍니다. 나는이 능력이 존재하지 않는다는 것을 의문시합니다. 그래서 어떻게 어떤 그룹이 촉발 될 필요가 있고 어떤 그룹이 탈출되어야 하는지를 확인할 수 있습니까?

내 디버그에서 트리거 할 그룹을 지정하는 모든 개체가 표시되지 않습니까?

아이디어가 있으십니까?

답변

0

이 유형의 유효성 검사를 허용하는 JSR 303 사양의 패턴을 발견했습니다. 상위 유효성 검사 규칙을 실행하지 않는 재귀 패턴은 중첩 된 유효성 검사 만 수행합니다. 이것은 매우 편리합니다. 중첩 된 유효성 검사 규칙은 다른 속성 값을 조건부로 기반으로하므로 중첩 된 jsr303 주석을 사용하여 조건 유효성 검사를 허용합니다.

@Documented 
@Constraint(validatedBy = ZipCodeValidator.class) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface ZipCode { 
String countryCode(); 
String message() default "{com.acme.constraint.ZipCode.message}"; 
Class<?>[] groups() default {}; 
Class<? extends Payload>[] payload() default {}; 
/** 
* Defines several @ZipCode annotations on the same element 
* @see (@link ZipCode} 
*/ 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@Documented 
@interface List { 
ZipCode[] value(); 
} 

내 자신의 검증은 더 이렇게 있습니다 :

@RequiredIf ({ 
@RequiredIf(ifField="field1", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg"), 
@RequiredIf(ifField="field2", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg") 
    }) 
관련 문제