2013-07-03 4 views
2

유효성 검사 주석이있는 bean이 있습니다. 나는 수동으로 다음 코드를 사용하여 유효성 검사를 실행할 것입니다 :프로그램의 빈 유효성 검사 메시지

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, validationGroup); 

내 질문은, 1.) 당신은 검증 및 2 실패한 필드를 얻는 방법) 방법 관련 메시지를받을 수 있나요?

.properties 파일을 사용하고 싶지 않습니다. 표시 할 프런트 엔드가 없습니다. 하지만 그 서비스와 나는 실패한 검증 메시지와 검증을 실패한 필드와 함께 응답을 보내야한다.

답변

4

유효성 검사에 실패한 필드는 어떻게 구할 수 있습니까?

유효성 검사에 실패한 입력란은 MethodConstraintViolationException으로 반환됩니다. getConstraintViolations()을 호출하여 개별 위반을 검색 한 다음 getPropertyPath()으로 필드를 검색하고 노드를 탐색 할 수 있습니다.

그러나 응답에서 반환 된 필드 이름이 빈의 속성 이름과 일치하지 않는 경우가 있습니다 (예 : 뱀 사례 응답 (예 : user_name)을 반환하는 경우).하지만 bean 속성 이름 username 인 경우 좀 더 창의적이어야합니다.

이 시나리오에서는 bean 유효성 검사 주석에 Payload으로 필드 이름을 저장할 수 있습니다.

응답 분야 :

@JsonProperty("user_name") 
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED, 
      payload = {FieldNamePayload.UserName.class}) 
private String username; 

페이로드 등급 :

public class FieldNamePayload 
{ 
    /** 
    * Represents the field name "user_name" 
    */ 
    public static class UserName implements ValuePayload 
    { 
     private static final String value = "user_name"; 

     @Override 
     public String getValue() 
     { 
      return value; 
     } 
    } 
} 

당신의 예외 매퍼의 페이로드 가져 :

List<MethodConstraintViolation<?>> violations = new ArrayList<MethodConstraintViolation<?>>(exception.getConstraintViolations()); 

    for(MethodConstraintViolation<?> violation : violations) 
    { 
     String field = getFieldName(violation); 
     String message = violation.getMessage(); 

     for(Class<? extends Payload> payload : new ArrayList<Class<? extends Payload>>(violation.getConstraintDescriptor().getPayload())) 
     { 
      //Retrieve field name from constraint payload 
      if(payload.isAssignableFrom(FieldNamePayload.UserName.class)) 
      { 
       field = getPayloadValue(payload); 
      } 
     } 

     //Create an error response here! 
    } 

어떻게 관련 메시지를 가져 옵니까?

는 기본적으로 콩 검증 프레임 워크는 다음과 같은 명명 규칙과 클래스 패스의 루트에 현지화 된 파일의 메시지를 조회 : 기본 로케일

  • ValidationMessages.properties. 현지화가

당신이 최대 절전 모드의 검증 공급자를 사용하고 ResourceBundleMessageInterpolator에 추가 할 사용자 정의 ResourceBundleLocator을 구현할 수에서이 동작을 무시하고 확인 메시지가 검색되는 위치를 변경하려면을 필요

  • ValidationMessages_{locale}.properties.

    ValidatorFactory validatorFactory = Validation 
        .byProvider(HibernateValidator.class) 
        .configure() 
        .messageInterpolator(
         new ResourceBundleMessageInterpolator(
          new MyCustomResourceBundleLocator())) 
        .buildValidatorFactory(); 
    
  • +0

    메시지를 덮어 쓰지 않고 기본 유효성 검사 메시지를 받고 싶습니까? –

    +1

    기본 메시지는 MessageConstraintViolation 오브젝트에 있습니다. getMessage() 메소드를 호출하십시오. 위의 예외 매퍼 코드를 살펴보십시오. – gregwhitaker

    +0

    설명해 주셔서 감사합니다. –

    1

    1과 관련하여 필드 란 무엇입니까? java.lang.reflect.Field? 직접 액세스 할 수는 없습니다. 당신이 할 수있는 것은 ConstraintViolation # getPropertyPath를 호출하여 속성 경로를 얻는 것입니다. 노드를 반복해야하고 리프 노드에서 getName()을 호출하여 속성 이름을 가져오고 getKind()를 호출하여 노드 유형을 결정해야합니다. (2)에 관한

    는 ConstraintViolation #의 getMessage()는 당신에게 보간 오류 메시지

    나는 당신이 등록 정보 파일을 사용하지 않는 것을 말할 때 당신이 무슨 뜻인지 모르겠습니다을 제공합니다. Bean 유효성 검사는 기본적으로 등록 정보 파일 (내장 된 것 또는 응용 프로그램에 추가 한 것)에서 오류 메시지를 읽습니다.

    +0

    1) 필드는 bean 변수/속성을 의미합니다. "필드"가 아닙니다. @NotNull을 지정하고 해당 변수가이 제약 조건을 충족시키지 못하면 메시지를 가져올 수 있어야합니다. 2. 오류 메시지에 대한 인터넷 검색은 Bean 유효성 검사 오류 메시지에 대한 등록 정보 파일을 사용하여 샘플을 반환했습니다. 그러나, 나는 그것을 사용하려고하지 않는다. –