[spring boot + thymleaf] validation 시 에러메세지가 출력되지 않음

hyein song·2022년 8월 25일
0

springboot + thymleaf 프로젝트에서 회원가입 기능을 구현하는데 에러메세지가 출력되지 않아 열심히 구글링했지만 해결책을 찾지못했습니다

그래서 오류 메세지를 열심히 째려본 결과 답을 찾아냈습니다.

System.out.println(result.getAllErrors());

result에 들어있는 에러들을 모두 출력해본 결과 아래와 같은 문자열이 출력되었습니다.

[Field error in object 'register' on field 'name': rejected value []; ...]

계속 보다보니 'register' 라는 문구가 맘에걸리기 시작했습니다.
저는 컨트롤러와 html에서 registerForm이라는 이름으로 넘겨주고 받고있었고, register이라는 이름은 Dto에만 있었기 때문입니다.

네, 이게 바로 원인이였습니다!!!!!!!!!!

회원가입을 위해 만든 Dto의 이름과 th:object로 설정해준 객체의 이름이 달랐기 때문이였습니다.

수정하기 전 코드는 아래와 같습니다.

Register(Dto)

		@Data
        @NoArgsConstructor
        @AllArgsConstructor
        public static class Register{
			,,,
        }

Controller

@PostMapping("/register")
    public String registerForm(@Valid Request.RegisterForm registerForm, BindingResult result, Model model){
        model.addAttribute("registerForm",registerForm);

        if (result.hasErrors()) {
            return "register";
        }
        
        userService.register(registerForm);
        return "redirect:/";
    }

register.html

<form th:action="@{/users/register}" th:object="${registerForm}" method="post">
	<div class="col-md-6 form-group">
		<label th:for="name">이름</label>
		<input id="name" name="name" th:feild="*{name}" th:errorclass="field-error" class="form-control" type="text" placeholder="이름">
		<span class="field-error" th:errors="*{name}">name error</span>
    </div>
</form>

위의 코드들을 보면

  • 회원가입을 위해 만든 Dto 이름: Register
  • 컨트롤러에서 모델에 추가해준 이름: registerForm
  • 타임리프에서 받는 객체의 이름: registerForm

으로 되어있습니다.

Dto의 이름을 RegisterForm으로 변경해주니 정상적으로 에러메세지들이 나타나기 시작했습니다.

컨트롤러에서 유효성검사에 통과하지 못해 다시 register.html으로 돌아갈때에 model에 넣어준 이름으로 객체를 찾는줄 알았더니 아니였습니다.

처음해봐서 그런지 정말 간단한것에서 몇시간을 붙잡혀있었네요..

0개의 댓글