private final ItemValidator itemValidator;
@InitBinder
public void init(WebDataBinder dataBinder) {
log.info("init binder {}", dataBinder);
dataBinder.addValidators(itemValidator);
}
삭제해주기
스프링 MVC가 어떻게 Bean Validator를 사용할까
스프링 부트는 자동으로 글로벌 Validator로 등록한다.
검증 순서
MessageCodesResolver가 또 알아서 메시지 코드를 생성해준다.
BeanValidation 메시지 찾는 순서
1. 생성된 메시지 코드 순서대로 messageSource에서 찾기
2. 애노테이션의 message 속성 사용 -> @NotBlank(message = "공백!{0}")
3. 라이브러리가 제공하는 기본 값 사용 -> 공백일 수 없습니다.
객체자체에 문제가 있을 때 또는 필드 값들을 조합하여 validation을 해야 할 경우
@ScriptAssert()가 있는데 안씀 그냥
오브젝트 오류 관련 부분만 직접 자바 코드로 작성하는 것을 권장하고 있슴
그 냥 HTTP body 에 있는거 객체와 매핑 시켜주는거임
또는 Url 쿼리 스트링
일단 똑같애 해줫음
데이터를 등록할 때와 수정할 때는 요구사항이 다를 수 있다.
그냥 item 에 있는 어노테이션 수정하면 안됨
잘안쓴다 패스한다
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
//특정 필드 예외가 아닌 전체 예외
if (form.getPrice() != null && form.getQuantity() != null) {
int resultPrice = form.getPrice() * form.getQuantity();
if (resultPrice < 10000) {
bindingResult.reject("totalPriceMin", new Object[]{10000,
resultPrice}, null);
}
}
if (bindingResult.hasErrors()) {
log.info("errors={}", bindingResult);
return "validation/v4/addForm";
}
//성공 로직
Item item = new Item();
item.setItemName(form.getItemName());
item.setPrice(form.getPrice());
item.setQuantity(form.getQuantity());
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v4/items/{itemId}";
}
이런식으로 써준다