본문 바로가기
개발/Spring

[Spring Validation] BindingResult 오류메시지 추가 / properties 파일 / 샘플 코드

by Allonsy 2022. 2. 20.
반응형

@BindingResult를 @ModelAttribute 뒤에 넣어주면 검증 값을 담아줄 수 있다.

 

BindingResult는 Errors 인터페이스를 상속받은 인터페이스이며,

스프링에서는 BeanPropertyBindingResult 구현 클래스를 넘겨준다

 

rejectValue 메서드는 다양한 파라미터로 오버로딩되어있는 메서드인데

여기서 오류 필드와 에러 코드, 에러 아규먼트, 디폴트 메시지를 지정해줄 수 있다

 

AbstractBindingResult 추상 클래스는 AbstractErrors 추상 클래스를 상속받는다

 

컨트롤러 코드 샘플

@PostMapping("/test")
public String test(@ModelAttribute Item item, BindingResult bindingResult) {
        
        if(!StringUtils.hasText(item.getItemName())) {
        // AbstractError 추상 클래스에서 구현한 rejectValue
            bindingResult.rejectValue("itemName", "required");
        }
        
        if(item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
        // AbstractBindingResult 추상 클래스에서 구현한 rejectValue
        	bindingResult.rejectValue("price", "range",new Object[]{1000,1000000}, null);
        }
        
        // 검증에 실패하면 다시 입력 폼으로
        if(bindingResult.hasErrors()) {
            log.info("errors = {}", bindingResult);
            return "testForm";
        }
}

rejectValue에 넘겨주는 error code 는 properties에 정의해두고 사용하면 된다

1. application.properties 파일에 오류메시지 프라퍼티 파일 추가

spring.messages.basename=messages, errors

2. errors.properties 파일에 에러코드와 오류메시지 작성

required.item.itemName=상품 이름은 필수입니다.
range.item.price=가격은 {0} ~ {1} 까지 허용합니다.

 

error code는 아래 우선순위에 따라 순서대로 적용된다(더 구체적인 것 먼저 적용, 없으면 우선순위 낮은걸 찾아서 적용)

DefaultMessageCodesResolver.java 클래스 주석 참고

 

메시지 코드 우선순위
1.: code + "." + object name + "." + field
2.: code + "." + field
3.: code + "." + field type
4.: code


메시지 코드 샘플
1. try "typeMismatch.user.age"
2. try "typeMismatch.age"
3. try "typeMismatch.int"
4. try "typeMismatch"

반응형

댓글