S T U D Y * * * * * * /proj/MONEYBAG

spring @Valid && BindingResult 에러발생 정리

썬,더 호글 2015. 7. 20. 11:32

@RequestMapping(value = "/insert", method = RequestMethod.POST) public String createUser(@Valid User user, BindingResult result, @RequestParam("multipartFile") MultipartFile file, Model model, HttpSession session, HttpServletRequest request) { //validation 에러 발생 시 if (result.hasErrors()) { logger.info(" 유효성 에러 "); List<ObjectError> list = result.getAllErrors(); for (ObjectError error : list) { logger.debug("error:{}",error.getDefaultMessage()); } return "user/signup";

}


안 예쁘지만, 일단은 진행한다. 


문제가 발생했던 것은 @Valid를 User객체에 붙이는데서 시작됐다. 


1. User.class에 validation 조건을 달았는데그에 대한 유효성 체크가 되지 않고 400이 계속 발생했다. 


>> 문제로 의심한 내용들

- spring form tag를 사용하지 않아서?

- User객체의 모든 변수를 채워서 보내지 않아서?

- 다른 변수 때문에..기타 등등

- (그 와중에 확인되지 않은 의문은 @NotEmpty일 때는 에러가 나는데 @NotNull은 괜찮더라.) 


>>확인 결과 

@Valid User user, BindingResult result,

두 인자의 순서에 영향을 받는다. 처음 에러를 냈을 때는 result가 인자의 가장 마지막에 들어가 있었다. 너무 오랫동안 안돼서 아예 새로운 requestmapping을 만들어서 인자를 두개만 놓고 실험했더니 성공. 그리고 알게 된 것은 BindingResult가 아예 @Valid 앞에 들어갈 경우 500이 발생한다는 점.




2. custom error message를 유저에게 보여주기




message.properties를 file로 생성해서 조건.class이름.변수명 =" error message"로 작성해 넣었다. 문장별 parsing 문자는 없었다. {0}, {1}, {2}는 각각 앞의 validation 조건/ class name, 필드명 을 넣을 수 있도록 되어있다.


즉, Email.user.email == {0}.{1}.{2} 의 순서로 출력하려는 내용에 내보낼 수 있다는 것.


validation 코딩 수정하는데만 12시간은 쓴 것 같다. 그래도 해결돼서 기분이 좋음.