@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"
'개발 > Spring' 카테고리의 다른 글
[Spring] @Transactional 핵심 정리 / 우선순위, 프록시, 예외 (0) | 2022.11.26 |
---|---|
[Springboot] 라이브러리 의존성 버전 확인 및 선택하는 방법! dependency version (0) | 2022.03.31 |
[Spring Security] 요청 권한 설정 / HttpMethod, url 패턴으로 접근 권한 관리 (0) | 2022.01.21 |
[Springboot] DB migration Tool / Flyway 설정 방법 (0) | 2022.01.19 |
[Springboot] 초기 DB schema 생성, data 로드 방법 (0) | 2022.01.19 |
댓글