item=상품
item.itemName=상품명
item.itemPrice=상품가격
messages.properties
hello=안녕
hello.name=안녕 {0}
messages_en.properties
hello=hello
hello.name=hello {0}
spring.messages.basename=messages,config.i18n.messages
기본 설정값은 messages 추가 설정시 ',' 를 사용해서 추가
i18n은 다국화 처리
public FieldError(String objectName, String field, String defaultMessage);
public FieldError(String objectName, @Nullable Object rejectValue, boolean bindingFailure, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage);
파라미터 종류
objectName : 오류가 발생한 객체명
field : 오류 필드
rejectValue : 사용자가 입력한 값(오류 값)
bindingFailure : 타입오류 가은 바인딩 실패인지, 검증 실패인지 구분값
codes : 메시지 코드
argument : 메시지에서 사용하는 인자
defaultMessage : 기본 오류메시지
*ObjectError 도 유사하게 두가지 생성자를 제공한다.
application.properties에 메시지 설정추가
'spring.message.basename=messages,errors'
errors.properties 추가
객체오류
1: code + "." + object name
2: code
ex) 오류코드가 : required, object name : item
1: required.item
2:required
필드오류
1: code + "." + object name + "." + field
2: code + "." + field
3: code + "." + fiedl type
4: code
ex) 오류코드 : typeMismatch, object name : user,
field : age, field type : int
1:typeMismatch.user.age
2:typeMismatch.age
3:typeMismatch.int
4:typeMismatch
errors.properties 예시
#objectError Level1
totalPriceMin.item=상품의 가격은 {0}원 이상이어야 한다. 현재값 = {1}
#Lever2
totalPriceMin=가격은 {0}원 이상이어야 한다. 현재값 = {1}
#FieldError Level1
required.item.itemName=상품명은 필수입니다.
required.item.price=가격은 {0}~{1}까지 허용합니다.
#Lever2
생략
#Lever3
required.java.lang.String=필수 문자입니다.
required.java.lang.Integer=필수 숫자입니다.
#Levet4
required=필수 값 입니다.
*자세한 내용부터 우선순위로 메시지가 생성된다.
reject(), rejectValue() 메서드
void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
void reject(String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
파라미터
field : 오류 필드명
errorCode : 오류코드명 (기본 오류메시지 활용)
errorsArgs : 오류메시지 {0}을 치환하기 위한 값
defaultMessage : 오류메시지를 하나도 못찾을 경우 사용할 메시지 기본값
public String add(@ModelAttribute Item item, BindingResult bindingReult){
----
검증로직
검증 오류가 있을 경우
1.ObjectError, FieldError 사용
bindingResult.addError(new ObjectError(--));
bindingResult.addError(new FieldError(--));
2.rejectValue, reject 사용
BindingResult는 target (item) 이라는 것을 알기에 단순화 가능
bindingResult.rejectValue("itemName","required");
bindingResult.reject("totalPriceMin",new Object[]{10000,10000},null);
----
}
ItemSaveForm item저장용 폼 예시
BeanValidation 애노테이션 적용
@Data
public class ItemSaveForm{
@NotBlank
private String itemName;
@NotNull
@Range(min = 1000, max = 1000000)
private Integer price;
}
public String addForm(@Valid @ModelAttribute ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes){
---
@Valid,@Validate로 ItemSaveForm의 FieldError는 BindingError로 바인딩된다.
bindingResult가 있을 경우 에러 처리
ObjectError는 따로 구현하는게 편함.
RedirectAttributes는 페이지 리다이렉션을 위하여 사용
---
return "redirect:/~~";
}