-
[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 단
1234567891011121314151617181920212223242526// 비번 변경 코드 생성하는 에이젝스$.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
1234567891011// 비밀번호 변경 코드 생성하기@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)
12345678// 유저코드로 비번재설정코드 생성public String getCodeByUserCode(String userCode){IUserDAO dao = sqlSession.getMapper(IUserDAO.class);String returnValue = dao.issuePasswordResetCode(userCode);return returnValue;}cs mybatis
1234567891011<!-- 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
123456789101112131415// 비밀번호 변경 코드 생성하기@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)
123456789// 유저코드로 비번재설정코드 생성public UserDTO getCodeByUserCode(UserDTO dto){IUserDAO dao = sqlSession.getMapper(IUserDAO.class);dao.issuePasswordResetCode(dto);return dto;}cs mybatis
123456789101112131415// 비밀번호 변경 코드 생성하기@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 아무래도 팀 프로젝트다 보니 중간에 설계가 바뀌었을 때 미처 파라미터나 반환 타입을 수정하지 못하는 경우가 발생한다.
이럴 땐 에러 메시지를 자세히 보고, 세세한 부분까지 체크해봐야 한다.
'Error' 카테고리의 다른 글
[iBatis] UPDATE 쿼리에 dynamic 쿼리 적용 시 SET 절 (0) 2021.04.28 [Spring/java] 객체에 NullPointException? Servlet.xml을 확인하자 (0) 2021.02.18 [Java/Spring] org.apache.ibatis.binding.BindingException: 에러 (0) 2020.08.25