public FieldError(String objectName,String field,String message){}
global 오류가 발생시 new ObjectError에 담아준다.
public ObjectError(String objectName,String defaultMessage){}
addItem에다가 BindingResult를 추가
@PostMapping("/add")
public String addItemV1(@ModelAttribute("item") Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes
, Model model){
//상품명은 필수
if(!StringUtils.hasText(item.getItemName())){
bindingResult.addError(new FieldError("item","itemName","상품 이름은 필수입니다."));
}
//가격은 1000원이상 1백만원 이하
if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
bindingResult.addError(new FieldError("item","price","가격은 1000 ~ 1000000 까지 허용합니다."));
}
//수량은 최대 9999
if(item.getQuantity() == null || item.getQuantity() > 9999){
bindingResult.addError(new FieldError("item","quantity","수량은 최대 9999까지 가능합니다."));
}
//가격 * 수량의 합은 10000원을 넘어야한다.
if(item.getPrice() != null && item.getQuantity() != null){
int resultPrice = item.getPrice() * item.getQuantity();
if(resultPrice < 10000){
bindingResult.addError(new ObjectError("item","가격 * 수량의 합은 10000원 이상이여야합니다. 현재값 = " + resultPrice));
}
}
if(bindingResult.hasErrors()){
log.info("errors={}",bindingResult);
return "validation/v2/addForm";
}
itemRepository.save(item);
redirectAttributes.addAttribute("itemId",item.getId());
redirectAttributes.addAttribute("status",true);
return "redirect:/validation/v2/items/{itemId}";
}
BindingResult는 ModelAttribute인 item 뒤에다가 해야한다.
html 부분도 타임리프와 스프링에서 추가로 제공해준다.
<div th:if="${errors?.containsKey('globalError')}">
<p class="field-error" th:text="${errors['globalError']}">전체 오류 메시
지</p>
<div th:if="${#fields.hasGlobalErrors()}">
<p class="field-error" th:each="err : ${#fields.globalErrors()}"
th:text="${err}">글로벌 오류 메시지</p>
위의 코드를 아래의 코드로 변경이 가능하다.
검증 오류를 적용하는 3가지 방법
BindingResult 인터페이스는 Errors 인터페이스를 상속받고있음
FieldError에는 2가지 생성자가 존재한다.
public FieldError(String objectName,String field, String defaultMessage);
public FieldError(String objectName,String field, @Nullable Object rejectValue, boolean bindingFailure,@Nullable String[] codes,@Nullable Object[] arguments, @Nullable String defaultMessage)
밑의 생성자를 사용하면 오류가 발생해도 사용자 입력값을 유지할 수있다.
new FieldError("item", "price", item.getPrice(), false, null, null, "가격은 1,000 ~
1,000,000 까지 허용합니다.")