| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
Tags
- tracking-modes
- #@Transacional
- COPYOFRANGE
- SPOF
- TDZ
- RequestMappingHandlerMapping
- type eraser
- wrapper class
- CORS
- hoisting
- 벌크연산
- pessimistic lock
- Transaction
- 단어변환
- IllegalStateException
- 프로그래머스
- assertJ
- Generic method
- optimistic lock
- CQS
- cross-cutting concerns
- generic type
- 역정규화
- HandlerMethod
- ExceptionResolver
- demand paging
- API
- NestJS 요청흐름
- Java
- propagation
Archives
- Today
- Total
jingyulog
MessageCodesResolver 본문
📌 오류 코드와 메시지 처리
- 객체명과 필드명을 조합한 메시지가 있는지 확인한다. (Level 1)
- 더 범용적인 메시지를 선택한다. (Level 2)
#Level 1
required.item.itemName: 상품 이름은 필수입니다.
#Level 2
required: 필수 값입니다.
✏️ MessageCodesResolver 개요
- 검증 오류 코드로 메시지 코드들을 생성한다. (우선순위 적용)
- MessageCodesResolver는 interface이고, DefaultMessageCodesResolver는 기본 구현체이다.
- 주로 ObjectError, FieldError 와 함께 사용한다.
📋 DefaultMessageCodesResolver의 기본 메시지 생성 규칙
- object error (객체 오류)
- error code + " . " + object name
- error code
- field error (필드 오류)
- error code + " . " + object name + " . " + field
- error code + " . " + field
- error code + " . " + field type
- error code
🔎 동작 방식
- rejectValue()와 reject()는 내부에서 MessageCodesResolver를 사용한다. 여기에서 메시지 코드들을 생성한다.
- FieldError와 ObjectError의 생성자를 보면, 여러 오류 코드를 가질 수 있다. 즉, MessageCodesResolver 를 통해서 생성된 순서대로 오류 코드를 보관하는 것이다.
public FieldError(String objectName, String field, @Nullable Object rejectedValue, boolean bindingFailure,
@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
public ObjectError(String objectName, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
- 이 부분을 BindingResult의 로그를 통해서 확인해보면 다음과 같다.
codes [range.item.price, range.price, range.java.lang.Integer, range]
TestCode
package hello.itemservice.validation;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.validation.DefaultMessageCodesResolver;
import org.springframework.validation.MessageCodesResolver;
import static org.assertj.core.api.Assertions.*;
public class MessageCodesResolverTest {
MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();
@Test
void messageCodesResolverObject() {
String[] messageCodes = codesResolver.resolveMessageCodes("required", "item");
for (String messageCode : messageCodes) {
System.out.println("messageCode = " + messageCode);
}
assertThat(messageCodes).containsExactly("required.item", "required");
}
@Test
void messageCodesResolverField() {
String[] messageCodes = codesResolver.resolveMessageCodes("required", "item", "itemName", String.class);
for (String messageCode : messageCodes) {
System.out.println("messageCode = " + messageCode);
}
assertThat(messageCodes).containsExactly(
"required.item.itemName",
"required.itemName",
"required.java.lang.String",
"required"
);
}
}
'Tech > 스프링' 카테고리의 다른 글
| Validator (0) | 2023.02.07 |
|---|---|
| 오류 코드와 메시지 처리 (0) | 2023.02.07 |
| 메시지와 국제화 (0) | 2023.02.07 |
| Spring MVC HTTP 메시지 컨버터 (0) | 2023.02.01 |
| JSP와 타임리프 간 foreach 구문 사용법 비교 (0) | 2023.01.31 |