@ScriptAssert(lang="javascript", script = "_this.price * _this.quantity >= 10000", message = "총 합이 10000원 이상이어야 합니다.")
public class Item {
private Long id;
@NotBlank(message="공백X")
private String itemName;
@NotNull
@Range(min=1000,max=100000)
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;
}
}
@ScriptAssert(lang="javascript", script = "_this.price * _this.quantity >= 10000", message = "총 합이 10000원 이상이어야 합니다.")
이 부분 이기는 한데..
@ScriptAssert(lang="대상언어", script="로직", message="메시지")
아마 이 부분이 템플릿의 자바스크립트에서 동작하게 만드는 것 같다..?
근데 좀 다를 듯. 서버사이드 상에서 자바스크립트로 하는 듯.
필드를 지정할 때는 _this. 이렇게 접근해야 한다.
script는 그냥 스크립트 언어이고, 단 논리연산자, 값이 true나 false로 반환되어야 하는 거다.
근데 사실 오브젝트 에러는 이 오브젝트 뿐만 아니라 다른 오브젝트까지 관련해서 비교해야 할 수도 있다..
이럴 때는 그냥..
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증 오류 보관
validMultiplePrice(item, bindingResult);
if(bindingResult.hasErrors()){
log.info("errors = {}", bindingResult);
return "/validation/v3/addForm";
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v3/items/{itemId}";
}
private void validMultipleQuantityPrice(Item item, BindingResult bindingResult){
if(item.getPrice() != null && item.getQuantity() != null){
int resultPrice = item.getPrice() * item.getQuantity();
if( resultPrice < 10000){
bindingResult.reject("MinQuantityPrice", new Object[]{10000, resultPrice, null);
}
}
}
이렇게 직접 그냥 컨트롤러에 넣어주기도 한다..
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
41. Form 전송객체 분리 (0) | 2023.09.04 |
---|---|
40. 컨트롤러 간 검증이 다른 경우. (0) | 2023.09.03 |
38. 빈 검증기 오류메시지 바꾸기 (0) | 2023.09.03 |
37. 빈 검증 (0) | 2023.09.02 |
36. 검증로직 분리 2 (0) | 2023.09.02 |