ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java/Spring] org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 에러
    Error 2020. 8. 18. 15:36

     

    BiscuitBall 프로젝트 비밀번호 재설정 기능을 구현하던 중 만난 에러.

     

    구글링 해 봤더니, 보통 이 에러는 myBatis XML에서 #{변수} 안의 '변수'와 DTO의 변수명이 일치하지 않아 생기는 문제라고 한다. 오타나 대소문자 문제가 대부분이라고 한다.

     

    그런데 내 경우는 오타, 대소문자 오류가 아니어서 발견하는데 오래 걸렸다.

     

     

    ※ 기능 설계에 대한 부연 설명

    사용자가 이메일을 입력하면 해당 이메일로 코드가 발급되고, 이를 인증하면 비밀번호 재설정을 할 수 있도록 구현하고자 했다.

    일단 DB상의 프로시저를 이용해, 특정 테이블에 임시코드를 저장하는 방식이다.

     

    사용자가 이메일을 입력한 후 코드 발급을 클릭하면 에이젝스ajax 처리로 DB상의 유저 코드를 불러오고

    유저 코드를 프로시저의 파라미터로 삽입해 임시 코드를 발급받으려고 했다. 덕분에 중첩된 콜백 함수를 써야 했음...

     

     

    이하 에러 코드 --

     

    js 단

    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
                                        // 비번 변경 코드 생성하는 에이젝스
                                        $.ajax(
                                        {
                                            url: "<%=cp%>/ajax/passwardreset/issuecode",
                                            type: "post",
                                            data: {userCode: data},
                                            success: function(code)
                                            {
                                                if (code!=0)
                                                {
                                                    alert(code+" 는 유저코드");
                                                    
                                                    $(".sendMessage").css("display","inline");
                                                    $(".inputCode").css("display","inline");
                                                }
                                                else
                                                {
                                                    alert("생성실패");
                                                }
                                            },
                                            error: function(e)
                                            {
                                              alert(e.responseText);
                                            }
                                            
                                        });
    cs

     

     

    controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // 비밀번호 변경 코드 생성하기
        @RequestMapping("/passwardreset/issuecode")
        public String getCodeByUserCode(Model model, @RequestParam("userCode"String userCode)
        {
            String view = null;
            
            model.addAttribute("returnValue", ajax.getCodeByUserCode(userCode));
            
            view = "/ajax/Check";
            return view;
        }
    cs

     

     

    model (service)

    1
    2
    3
    4
    5
    6
    7
    8
        // 유저코드로 비번재설정코드 생성
        public String getCodeByUserCode(String userCode)
        {
            IUserDAO dao = sqlSession.getMapper(IUserDAO.class);
            String returnValue = dao.issuePasswordResetCode(userCode);
            
            return returnValue;
        }
    cs

     

     

    mybatis

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        <!--     public void issuePasswordResetCode(String userCode) // 비번재설정코드발급-->
        <select id="issuePasswordResetCode" 
         parameterType="java.lang.String"
         statementType="CALLABLE">
            { call PRC_PWD_RESET_CODE
                (
                    #{userCode},
                    #{returnValue ,mode=OUT, jdbcType=VARCHAR}
                )
            }
        </select>
    cs

     

     

     

     

    DTO 구성으로 myBatis와 연동해 가져와야 하는데

    mybatis의 파라미터 타입이 String 인 것이 문제였다!

     

    public void issuePasswordResetCode(String userCode); // 비번재설정코드발급

     

    게다가 인터페이스의 파라미터 타입도 String 이어서 계속해서 에러가 발생한 것.

    결국 인터페이스단부터 UserDTO 타입으로 변경해 맞춰줬다. 

     

    public void issuePasswordResetCode(UserDTO userDTO); // 비번재설정코드발급 (수정 후)

     

     

     

     

     

    이하는 수정한 다음의 코드--

     

     

    controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        // 비밀번호 변경 코드 생성하기
        @RequestMapping("/passwardreset/issuecode")
        public String getCodeByUserCode(Model model, @RequestParam("userCode"String userCode)
        {
            String view = null;
            
            UserDTO dto = new UserDTO();
            dto.setUserCode(userCode);
            
            System.out.println(ajax.getCodeByUserCode(dto).getReturnValue());
            model.addAttribute("result", ajax.getCodeByUserCode(dto).getReturnValue());
            
            view = "/ajax/Check";
            return view;
        }
    cs

     

     

     

    model(service)

    1
    2
    3
    4
    5
    6
    7
    8
    9
        // 유저코드로 비번재설정코드 생성
        public UserDTO getCodeByUserCode(UserDTO dto)
        {
            IUserDAO dao = sqlSession.getMapper(IUserDAO.class);
     
            dao.issuePasswordResetCode(dto);
            
            return dto;
        }
    cs

     

     

     

    mybatis

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        // 비밀번호 변경 코드 생성하기
        @RequestMapping("/passwardreset/issuecode")
        public String getCodeByUserCode(Model model, @RequestParam("userCode"String userCode)
        {
            String view = null;
            
            UserDTO dto = new UserDTO();
            dto.setUserCode(userCode);
            
            System.out.println(ajax.getCodeByUserCode(dto).getReturnValue());
            model.addAttribute("result", ajax.getCodeByUserCode(dto).getReturnValue());
            
            view = "/ajax/Check";
            return view;
        }
    cs

     

     

     

    아무래도 팀 프로젝트다 보니 중간에 설계가 바뀌었을 때 미처 파라미터나 반환 타입을 수정하지 못하는 경우가 발생한다.

    이럴 땐 에러 메시지를 자세히 보고, 세세한 부분까지 체크해봐야 한다.

     

    댓글

Designed by Tistory.