복붙노트

[SPRING] 봄 검증 사용자 정의 메시지 - 필드 이름

SPRING

봄 검증 사용자 정의 메시지 - 필드 이름

문제 : Spring에서 유효성 검사 메시지에서 필드 이름을 얻는 방법

ValidationMessages.properties 파일에서 필드 이름에 액세스 할 수있는 방법이 있습니까? 예를 들어 아래에서 {0}을 사용해 보았지만 작동하지 않습니다. 어딘가에 보았습니다. Spring이 동적으로 필드 이름을 넣기를 원하므로 모든 클래스에 대해 반복 할 필요가 없습니다.

public class RegistrationForm {

    @NotEmpty(message = "{NotEmpty}")
    private String email;


    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

ValidationMessages.properties

NotEmpty={0} TEST

해결법

  1. ==============================

    1.ValidationMessages.properties 대신 Spring 메시지 번들 (예 : message.properties)을 사용하여 메시지를 현지화하는 경우 가능합니다.

    ValidationMessages.properties 대신 Spring 메시지 번들 (예 : message.properties)을 사용하여 메시지를 현지화하는 경우 가능합니다.

    예제를 사용하여 Spring은 (첫 번째 단계에서) messages.properties에서 다음 메시지 키 (또는 코드)를 사용하여 필드 이름을 지역화하려고 시도합니다.

    [RegistrationForm.email,email]
    

    아무것도 발견되지 않으면 필드 이름으로 돌아갑니다.

    그런 다음 Spring은 다음 키를 사용하여 지역화 된 오류 메시지를 찾습니다.

    [NotEmpty.RegistrationForm.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]
    

    여기서 NotEmpty는 java.lang.String, NotEmpty보다 우선 순위가 높으므로 필드 유형에 따라 메시지를 사용자 정의하려면 속지 마십시오.

    따라서 messages.properties에 다음 내용을 넣으면 원하는 동작을 얻을 수 있습니다.

    # for the localized field name (or just email as the key)
    RegistrationForm.email=Registration Email Address
    # for the localized error message (or use another specific message key)
    NotEmpty={0} must not be empty!
    

    SpringValidatorAdapter # javadoc에서 getArgumentsForConstraint () :

    ValidationMessages.properties를 사용하는 동안 @Size 주석의 max 속성을 참조하려면 {max}를 사용하고 {1}을 사용하는 Spring 메시지 묶음을 사용합니다 (알파벳은 알파벳순으로 정렬 할 때 @Size의 첫 번째 속성이기 때문에).

    자세한 내용은 필자의 기능 요청을 참조하여 현지 이름 현지화를 쉽게 할 수 있습니다.

    불행히도 코드를 밟아서 (지금이 포스트!).

    오류 필드를 지역화하는 데 사용되는 키를 찾으려면 BindingResult 값을 검사하십시오. 예를 들어,이 오류가 발생합니다.

    Field error in object 'RegistrationForm' on field 'email': rejected value []; codes [NotEmpty.RegistrationForm.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [RegistrationForm.email,email]; arguments []; default message [email]]; default message [may not be empty]
    

    SpringValidatorAdapter # getArgumentsForConstraint ()는 유효성 검사 주석 속성 값과 오류 메시지에 사용할 수있는 필드 이름을 작성합니다.

  2. ==============================

    2.Bean Validation 1.1 (JSR-349)에서는, 실제의 프로퍼티 필드의 이름으로 제약 메세지 보간을 제공하는 공개 API는 존재하지 않습니다. 그러한 기능이 존재한다면 노출 된 속성 전자 메일을 특히 다국어 기반 응용 프로그램에서 의미있는 표시로 변환하기 위해 보간 단계가 필요합니다.

    Bean Validation 1.1 (JSR-349)에서는, 실제의 프로퍼티 필드의 이름으로 제약 메세지 보간을 제공하는 공개 API는 존재하지 않습니다. 그러한 기능이 존재한다면 노출 된 속성 전자 메일을 특히 다국어 기반 응용 프로그램에서 의미있는 표시로 변환하기 위해 보간 단계가 필요합니다.

    현재 가장 가까운 것은 @NotEmpty 주석을 확장하고 원하는 속성의 이름을 전달할 수있는 속성을 속성에 추가하는 것입니다.

    public class RegistrationForm {
       @NotEmpty(label = "Email Address")
       private String email;
    }
    

    리소스 번들에서 메시지에 {label} 자리 표시자를 사용하여 제약 조건의 속성을 나타낼 수 있습니다.

    물론 이것은 위에서 언급 한 다국어 유스 케이스에는 도움이되지 않지만 적어도 firstName으로 정의했을 수있는 필드의 이름과 같은 레이블을 정의 할 수있는 기능을 제공합니다.

  3. from https://stackoverflow.com/questions/34249937/spring-validation-custom-messages-field-name by cc-by-sa and MIT license