spring @Valid && BindingResult 에러발생 정리
@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시간은 쓴 것 같다. 그래도 해결돼서 기분이 좋음.