-
[Spring-Error] Field Error 오류, 객체 바인딩 문제legacy/Spring 2023. 7. 6. 17:42
문제 발생
BindingResult에 필드 오류를 저장하여 View에 오류를 출력하려고 했는데 오류가 발생했다. 일단 코드를 확인하자.
LoginUser
@Data public class LoginUser { private String loginId; private String loginPassword; public LoginUser() { } }
Controller
@GetMapping("/login") public String login(Model model) { model.addAttribute("user", new LoginUser()); return "/login"; } @PostMapping("/login") public String loginCheck(LoginUser user, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if(user.getLoginId() == "" || user.getLoginId() == null) { bindingResult.rejectValue("loginId", "required"); } if(user.getLoginPassword() == "" || user.getLoginPassword() == null) { bindingResult.rejectValue("loginPassword", "required"); } if(bindingResult.hasErrors()) { bindingResult.reject("loginFailed", "로그인 실패"); return "/login"; } redirectAttributes.addAttribute("status", "success"); return "redirect:/home"; }
View
<body> <form th:action method="post" th:object="${user}"> <div th:if="${#fields.hasGlobalErrors()}"> <p class="field-error" th:each="error : ${#fields.globalErrors()}" th:text="${error}"></p> </div> <fieldset> <legend>로그인 테스트</legend> <label for="loginId">아이디</label> <input type="text" th:field="*{loginId}"> <p class="field-error" th:errors="*{loginId}"></p> <br> <label for="loginPassword">비밀번호</label> <input type="password" th:field="*{loginPassword}"> <p class="field-error" th:errors="*{loginPassword}"></p> </fieldset> <button>제출</button> </form> </body>
에러 메시지 properties 파일
required.user.loginId=아이디를 반드시 입력해야 합니다. required.user.loginPassword=비밀번호를 입력하세요 required=값을 입력하세요
코드를 보았을 때 뭐가 문제인지 알겠는가? 나는 전혀 모르겠다...
오류 출력
미해결
예외를 출력하는 부분에서 단서를 찾을 수 있다.
user 객체에 대한 BindingResult가 존재하지 않는다.
에러메시지 properties파일에 "required"를 최후의 수단으로 넣었음에도 호출되지 않고 오류가 난다는 것은 메시지 파일의 문제는 아닌 것 같다.
BindingResult가 검증하는 LoginUser 객체가 문제라는 건데... 이게 객체명을 바꾸면 정상적으로 작동한다.
즉, LoginUser user -> LoginUser loginUser 로 객체명을 바꾸니까 정상적으로 작동한다.
내 생각에는 검증을 대상으로 하는 객체명이 클래스명을 따라가야하는 것 같다.