Q&A
type에러와 field에러 처리 순서
푸덕푸더덕님이 하셨던 상황 // ValidationItemControllerV2.java // 여기서 먼저 typemismatch로 일어난 에러를 먼저 확인후 리다이렉트 if (bindingResult.hasErrors()){ log.info("errors = {}", bindingResult); return "redirect:{/abcd/aaa..}"; } // 에러가 없으면 Field 검증로직 시행 if(!StringUtils.hasText(item.getItemName())){ errors.rejectValue("itemName", "required"); } if (item.getPrice() == null || item.getPrice() 1000000){ errors.rejectValue("price", "range",new Object[]{1000, 1000000}, null); } ... 하고싶으신건 TypeMismatch 으로 리턴되는 시점과, Field 검증오류로 리턴되는 시점을 controller에서 구분하고, 따로 처리하시길 바라시는것같은데.. 이 강의에서 @Validated 어노테이션을 사용하게됨으로써, Controller의 hasErrors()를 호출하기전에 'ItemValidator'에서 이미 검증을 다하고 나와서 Controller로 접근하기 때문에, 이때는 어떻게 따로 Type Mistmatch만 뽑아서 controller에서 redirect 하는지 여쭤보는것같습니다. 잠깐 해본결과로는 .. ItemValidator의 validate()를 좀 수정해보면 해결되지 않을까 생각합니다 // ItemValidator.java @Override public void validate(Object target, Errors errors) { Item item = (Item) target; if ( ... ){ // Type을 검사 return; // Type이 맞지 않으면 Field 검증로직 전에 return } // Field 검증 로직 ... } // ValidatationControllerV2.java @PostMapping("/add") public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { if (bindingResult.hasErrors()){ List allErrors = bindingResult.getAllErrors(); // 모든 에러를 가져옴 for (ObjectError error : allErrors) { System.out.println("error = " + error.getCode()); // error = typeMissmatch // error.getCode()가 typeMissmatch이면 리다이렉트 !! return "redirect:/"; } log.info("errors = {}", bindingResult); return "validation/v2/addForm"; } .... } 이 결과, 테스트할땐 typeMissmatch를 캐치했기때문에 Field 검증이 작동되지않고, typeMissmatch만 Binding되서 form을 다시 리턴하도록 했는데, form을 리턴하는 대신 redirect 경로를 리턴한다면, 정상 동작하실것 같습니다! 저도 공부중이라.. 도움이 되실지는 모르겠지만, 테스트해보니 되긴해서 적어봅니다 !
- Likes
- 0
- Comments
- 3
- Viewcount
- 595

