티스토리 뷰

 

문제 발생

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 로 객체명을 바꾸니까 정상적으로 작동한다. 

내 생각에는 검증을 대상으로 하는 객체명이 클래스명을 따라가야하는 것 같다. 

 

 

 

Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30