ABOUT ME

-

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

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

     

     

     

Designed by Tistory.