1. 소개

메시지 보간은 Java Bean 유효성 검사 제약 조건에 대한 오류 메시지를 만드는 데 사용되는 프로세스 입니다. 예를 들어 javax.validation.constraints.NotNull 어노테이션으로 어노테이션이 있는 필드에 널값 을 제공하여 메시지를 볼 수 있습니다 .

이 예제에서는 기본 Spring 메시지 보간을 사용하는 방법과 자체 보간 메커니즘을 만드는 방법을 배웁니다.

javax.validation 외에 제약을 제공하는 다른 라이브러리의 예를 보려면 Hibernate Validator Specific Constraints를 살펴보십시오 . 사용자 정의 Spring Validation 어노테이션을 작성할 수도 있습니다 .

2. 기본 메시지 보간

코드 조각에 들어가기 전에 기본 @NotNull 제약 조건 위반 메시지 가있는 HTTP 400 응답의 예를 살펴 보겠습니다 .

{
    ....
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            ....
            "defaultMessage": "must not be null",
            ....
        }
    ],
    "message": "Validation failed for object='notNullRequest'. Error count: 1",
    ....
}

Spring은 메시지 설명자에서 제약 위반 메시지 세부 사항을 검색합니다. 각 제약 조건은 메시지 속성을 사용하여 기본 메시지 설명자를 정의 합니다. 하지만 물론 사용자 지정 값으로 덮어 쓸 수 있습니다.

예를 들어 POST 메소드를 사용하여 간단한 REST 컨트롤러를 생성합니다.

@RestController
public class RestExample {

    @PostMapping("/test-not-null")
    public void testNotNull(@Valid @RequestBody NotNullRequest request) {
        // ...
    }
}

요청 본문은 @NotNull 어노테이션이 달린 문자열 이 하나 뿐인 NotNullRequest 객체에 매핑됩니다 .

public class NotNullRequest {

    @NotNull(message = "stringValue has to be present")
    private String stringValue;

    // getters, setters
}

이제이 유효성 검사에 실패한 POST 요청을 보내면 사용자 지정 오류 메시지가 표시됩니다.

{
    ...
    "errors": [
        {
            ...
            "defaultMessage": "stringValue has to be present",
            ...
        }
    ],
    ...
}

변경되는 유일한 값은 defaultMessage 입니다. 하지만 여전히 오류 코드, 객체 이름, 필드 이름 등에 대한 많은 정보를 얻습니다. 표시되는 값의 수를 제한하기 위해 REST API에 대한 사용자 정의 오류 메시지 처리를 구현할 수 있습니다 .

3. 메시지 표현식을 사용한 보간

Spring에서는 Unified Expression Language를 사용하여 메시지 설명자를 정의 할 수 있습니다 . 이를 통해 조건부 논리를 기반으로 오류 메시지를 정의 할 수 있으며 고급 서식 옵션도 사용할 수 있습니다 .

더 명확하게 이해하기 위해 몇 가지 예를 살펴 보겠습니다.

모든 제약 어노테이션에서 검증중인 필드의 실제 값에 액세스 할 수 있습니다.

@Size(
  min = 5,
  max = 14,
  message = "The author email '${validatedValue}' must be between {min} and {max} characters long"
)
private String authorEmail;

오류 메시지에는 속성의 실제 값과 @Size 어노테이션 최소최대 매개 변수가 모두 포함 됩니다.

"defaultMessage": "The author email 'toolongemail@baeldung.com' must be between 5 and 14 characters long"

외부 변수에 액세스하려면 $ {} 구문을 사용하지만 유효성 검사 어노테이션에서 다른 속성에 액세스하려면 {}를 사용 합니다.

삼항 연산자를 사용할 수도 있습니다.

@Min(
  value = 1,
  message = "There must be at least {value} test{value > 1 ? 's' : ''} in the test case"
)
private int testCount;

Spring은 오류 메시지에서 삼항 연산자를 단일 값으로 변환합니다.

"defaultMessage": "There must be at least 2 tests in the test case"

외부 변수에 대한 메서드를 호출 할 수도 있습니다.

@DecimalMin(
  value = "50",
  message = "The code coverage ${formatter.format('%1$.2f', validatedValue)} must be higher than {value}%"
)
private double codeCoverage;

잘못된 입력은 형식화 된 값과 함께 오류 메시지를 생성합니다.

"defaultMessage": "The code coverage 44.44 must be higher than 50%"

이 예제에서 볼 수 있듯이 {,}, $/ 와 같은 일부 문자 는 메시지 표현식에 사용되므로 문자 그대로 사용하기 전에 백 슬래시 문자로 이스케이프해야합니다. \ {, \}, \ $,\\ .

4. 사용자 지정 메시지 보간

어떤 경우 에는 사용자 지정 메시지 보간 엔진구현 하려고합니다 . 그렇게하려면 먼저 javax.validation.MessageInterpolation 인터페이스를 구현해야합니다 .

public class MyMessageInterpolator implements MessageInterpolator {
    private final MessageInterpolator defaultInterpolator;

    public MyMessageInterpolator(MessageInterpolator interpolator) {
        this.defaultInterpolator = interpolator;
    }

    @Override
    public String interpolate(String messageTemplate, Context context) {
        messageTemplate = messageTemplate.toUpperCase();
        return defaultInterpolator.interpolate(messageTemplate, context);
    }

    @Override
    public String interpolate(String messageTemplate, Context context, Locale locale) {
        messageTemplate = messageTemplate.toUpperCase();
        return defaultInterpolator.interpolate(messageTemplate, context, locale);
    }
}

이 간단한 구현에서는 오류 메시지를 대문자로 변경합니다. 이렇게하면 오류 메시지가 다음과 같이 표시됩니다.

"defaultMessage": "THE CODE COVERAGE 44.44 MUST BE HIGHER THAN 50%"

우리는 또한해야 할 우리의 보간 등록 에서 javax.validation.Validation의 공장 :

Validation.byDefaultProvider().configure().messageInterpolator(
  new MyMessageInterpolator(
    Validation.byDefaultProvider().configure().getDefaultMessageInterpolator())
);

5. 결론

이 기사에서는 기본 Spring 메시지 보간이 작동하는 방법과 사용자 정의 메시지 보간 엔진을 만드는 방법을 배웠습니다.

그리고 항상 그렇듯이 모든 소스 코드는 GitHub에서 사용할 수 있습니다 .