2012-11-12 1 views
2

유효성 검사 클래스를 내부 클래스로 사용하여 첫 번째 사용자 지정 유효성 검사 주석을 만들었습니다. 은 다음과 같습니다빈 유효성 검사 메시지의 일부로 서식 지정 (문자열) 배열

@Target({ ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = {OneOfGroupNotNull.Validator.class}) 
@Documented 
public @interface OneOfGroupNotNull { 

    // custom annotation properties 
    String[] fields(); 

    // required by JSR-303 
    String message() default "One of group must be not null. {fields}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 

    public class Validator implements ConstraintValidator<OneOfGroupNotNull, Object> { 

     private String[] fields; 

     @Override 
     public boolean isValid(Object bean, ConstraintValidatorContext cvc) { 

      int countNotNull = 0; 

      for (String field : fields) { 
       try { 
        String property = BeanUtils.getProperty(bean, field); 
        if (property != null) { 
         countNotNull++; 
        } 
       } catch (Exception ex) { 
        throw new RuntimeException("Validation for field " + field + " of type " + bean.getClass()+ " raised exception.", ex); 
       } 
      } 

      return countNotNull == 1; 
     } 

     @Override 
     public void initialize(OneOfGroupNotNull a) { 
      fields = a.fields(); 
     } 
    } 
} 

같이 보일 수도 있습니다 검사기로 주석되는 빈 클래스 :

@OneOfGroupNotNull(fields = {"a", "b", "c"}) 
public interface MyBean { 
    String getA(); 
    Rarity getB(); 
    Boolean getC(); 
} 

문제는 내가 문자열 배열 "필드를 포맷 할 수있는 방법을 찾을 수 있다는 것입니다 ". to 문자열 메소드를 사용하면 다음과 같은 결과를 얻을 수 있습니다 : 그룹 중 하나가 null이 아니어야합니다. [Ljava.lang.String는, 당신은 StringString[]에서 fields의 유형을 변경 한 경우 157d954

답변

2

@ 다음 필드 이름과 메시지가 올바르게 표시됩니다. 제한에서 필드 이름을 얻으려면 그냥 split() 쉼표로.

또 다른 옵션은이 같은 제약 조건 내에서 사용자 정의 메시지를 생성하는 것입니다

사용하는 콩 검증의 구현
cvc.disableDefaultConstraintViolation(); 
cvc.buildConstraintViolationWithTemplate("error message") 
    .addNode("field name with error") 
    .addConstraintViolation(); 
+0

니스! 고맙습니다! – realsim

0

? Hibernate Validator 4.3을 사용한다면 이것은 실제로 작동해야합니다. https://hibernate.onjira.com/browse/HV-506을 참조하십시오.

해결 방법으로 리스트을 사용하지 않으시겠습니까? 거기에 기본 toString 더 현명합니다.

+0

1. 나는 최대 절전 모드를 사용하고 있으며 그것은 상자 밖으로 작동하지 않습니다. 2. List는 주석에 유효한 속성이 아닙니다. – realsim

+0

어떤 버전의 Hibernate Validator를 사용하고 있습니까? 우리는 이것을 4.3으로 수정했습니다. 아마 당신은 onlder 버전을 사용하고 있습니까? 방금 제약 조건을 시험해 보았고 "하나의 그룹이 null이 아니어야합니다. [a, b, c]"라는 오류 메시지가 나타납니다. – Gunnar