2017-10-26 8 views
0

우리는 클래스 수준의 검증 주석을 정의하는 경우를 해결하기 위해 클래스 수준의 검증, 필드를 비교하고이 같은 ConstraintValidator이 같은 하나봄 검증 - 필드 오류

public class ComparisonValidator implements ConstraintValidator<ValueMatches, Object> 
{ 
    private String[] fields; 

    @Override 
    public void initialize(final ValueMatches constraintAnnotation) { 
     fields = constraintAnnotation.fields(); 
    } 

    @Override 
    public boolean isValid(final Object value, final ConstraintValidatorContext context) { 
     if (fields.length == 0) { 
      return true; 
     } 

     final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value); 
     final Object comparisonValue = beanWrapper.getPropertyValue(fields[0]); 

     for (int i = 1; i < fields.length; i++) { 
      final Object fieldValue = beanWrapper.getPropertyValue(fields[i]); 

      if (!comparisonValue.equals(fieldValue)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

우리는 물론 글로벌 유효성 검사 오류가 발생을, Thymeleaf를 통해 액세스 할 수 있습니다 : ${#fields.errors('global')}

이제 어떻게 그 오류를 식별하고 특정 비교 오류인지 이해할 수 있습니까? 우리가 범 세계적인 실수에 대한 메시지를 얻은 후에, 아니면 내가 틀렸는가?

답변

0

젠장, 봄 문서! 매우 간단하지만 실제로 이해할 수는 없습니다.

@Override 
public boolean isValid(final Object value, final ConstraintValidatorContext context) { 
    if (fields.length > 0) { 
     final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value); 
     final Object comparisonValue = beanWrapper.getPropertyValue(fields[0]); 

     for (int i = 1; i < fields.length; i++) { 
      if (!comparisonValue.equals(beanWrapper.getPropertyValue(fields[i]))) { 
       context.disableDefaultConstraintViolation(); 
       context.buildConstraintViolationWithTemplate(errorMessage).addPropertyNode(fields[0]).addConstraintViolation(); 
       return false; 
      } 
     } 
    } 

    return true; 
} 

주석 자체를 사용하여 제약 조건 위반 객체를 생성하지 않도록 ConstrainValidatorContext을 알려줍니다 disableDefaultConstraintViolation() 방법.

그런 다음 buildConstraintViolationWithTemplate() 메서드를 통해 사용자 지정 제약 조건 위반을 생성 할 수 있습니다.