작성
·
423
답변 3
2
1
푸덕푸더덕님이 하셨던 상황
// 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() < 1000 || 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<ObjectError> 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 경로를 리턴한다면, 정상 동작하실것 같습니다!
저도 공부중이라.. 도움이 되실지는 모르겠지만,
테스트해보니 되긴해서 적어봅니다 !
1
서희륜님 멋진 공유 감사합니다^^!