티스토리 뷰
문제 발생
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 로 객체명을 바꾸니까 정상적으로 작동한다.
내 생각에는 검증을 대상으로 하는 객체명이 클래스명을 따라가야하는 것 같다.