검증 오류 코드는 2가지로 나뉜다.
price 필드에 문제 "A" 를 입력할 경우
codes[typeMismatch.item.price,typeMismatch.price,typeMismatch.java.lang.Integer,ty
peMismatch]
이렇게 bindingResult가 담겨있을 것이다.
#추가
typeMismatch.java.lang.Integer=숫자를 입력해주세요.
typeMismatch=타입 오류입니다.
스프링은 검증을 체계적으로 제공하기 위해서 Validator라는 인터페이스를 제공한다.
public interface Validator {
boolean supports(Class<?> clazz);
void validate(Object target, Errors errors);
}
validate에 target을 item으로 캐스팅을 하고 값이 들어있는지 여기서 검증을 진행해준다.
@Component
public class ItemValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Item.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Item item = (Item) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"itemName","required");
if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() >
1000000) {
errors.rejectValue("price","range",new Object[]{1000,1000000},null);
}
if (item.getQuantity() == null || item.getQuantity() >= 10000) {
errors.rejectValue("quantity","max",new Object[]{9999},null);
}
//특정 필드 예외가 아닌 전체 예외
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item.getPrice() * item.getQuantity();
if(resultPrice < 10000){
errors.reject("totalPriceMin",new Object[]{10000,resultPrice},null);
}
}
}
}
컨트롤러에 밑의 코드를 추가
@InitBinder
public void init(WebDataBinder dataBinder){
log.info("init Binder {}", dataBinder);
dataBinder.addValidators(itemValidator);
}
Validated를 추가해서 addItem 변경
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute("item") Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
if(bindingResult.hasErrors()){
log.info("target = {}",bindingResult.getTarget());
return "validation/v2/addForm";
}
//성공 로직
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v2/items/{itemId}";
}
글로벌 설정
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator() {
return new ItemValidator();
}
}