@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
//직접 자바코드로 작성해서 글로벌 오류를 잡아준다.
if(item.getPrice() != null && item.getQuantity() != null){
int resultPrice = item.getPrice() * item.getQuantity();
if(resultPrice < 10000){
bindingResult.reject("totalPriceMin",new Object[]{10000,resultPrice},null);
}
}
if(bindingResult.hasErrors()){
log.info("target = {}",bindingResult.getTarget());
return "validation/v3/addForm";
}
//성공 로직
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v3/items/{itemId}";
}
수정시에도 현재 요구사항 문제를 해결하기 위해서 items를 수정해준다.
@Data
public class Item {
@NotNull
private Long id;
@NotBlank(message = "공백은 입력할 수 없습니다.")
private String itemName;
@NotNull
@Range(min=1000,max = 1000000)
private Integer price;
@NotNull
// @Max(9999)
private Integer quantity;
public Item() {
}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
이문제를 해결하기 위해서는 2가지 방법이 존재한다.
여기서 진행할것은 groups기능을 사용할 것이다.
저장용 SaveCheck 인터페이스와 UpdateCheck 인터페이스를 생성
저장로직에 SaveCheck Groups 를 적용시켜준다.
@PostMapping("/add")
public String addItem(@Validated(SaveCheck.class) @ModelAttribute("item") Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
수정로직에는 UpdateCheck Groups를 적용
@PostMapping("/{itemId}/edit")
public String edit(@PathVariable("itemId")Long itemId, @Validated(UpdateCheck.class) @ModelAttribute Item item, BindingResult bindingResult){
주의점 : @Valid는 Groups를 적용하는 기능이 없기 때문에 @Validated를 사용해야함.
전반적으로 복잡도가 증가하기 때문에 그렇게 권장하는 방법이 아니다.