에러해결

[에러해결]java.lang.IllegalArgumentException: No converter found for return value of type: class java.lang.Integer

intp프로그래머 2023. 1. 19. 13:58

아이디 중복 확인 체크 기능을 ajax로 구현하던 중 발생한 에러이다.

아래 4단계를 거쳐 해결이 되었다.

 

1. pom.xml에 jackson-databind 과 jackson-core 추가.
(에러 발생시 : 프로젝트 우클릭 - Maven - Add Dependency - jackson 검색해서 아래 2개 생성해줘야 버전이 알맞게 들어가는 것 같다. 정 없다면 아예 jar 파일을 추가해줘야 하지싶다. )

		<!-- JSON관련 lib -->
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.9.4</version>
		</dependency>
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-core</artifactId>
		    <version>2.13.3</version>
		</dependency>

 

2. dispatcher-servlet.xml에 아래 코드 추가(효과가 있는진  모르겠는데 구글링 해보니 converter를 추가해서 해결하는 경우가 많더라.)

<!--  @ResponseBody 및 json converter 관련 에러    -->
    <mvc:annotation-driven>
     <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
     </mvc:message-converters>
   </mvc:annotation-driven>


3. 관련 ajax 부분 코드에   datatype: 'json' ,  추가

	$(document).ready(function() { 
		//회원가입시 아이디 중복 검사
		$(".id_confirm").on("focusout", function checkId() {
		    var inputed = $('#id').val(); // id값으로 'id'를 가진 'input에 입력한 값'
		    console.log(inputed);
		    $.ajax({
		      data : {
		    	  id : inputed //입력한 값을 id라는 변수에 담음
		      },
		      datatype: 'json',
		      url : "/checkid", // data를 checkid url에 보냄 (Controller에서 받아서 처리. 중복이 되면 1, 아니면 0을 반환하는 함수를 구현했다.)
		      method:'post',
		      success : function(result) {
		         if(result == "1") { //아이디가 중복되었을 때 
		            //아이디가 중복되었을 때 기능처리
// 		        	 alert("이미 존재하는 아이디 입니다.");
	                  $('#id_div').html('<a style="color: red;">사용 불가능한 아이디 입니다.</a>');
// 		             id_overlap_input.focus();
		             return f;
		         } else if (result == "-1") {
		             alert('아이디를 입력해주세요.')
		             return;
		         } else {
		             $('#id_div').html('<a">사용 가능한 아이디 입니다.</a>');
		             
// 		             $('.username_input').attr("check_result", "success");
// 		             $('#id_check_sucess').show();
// 		             $('.id_overlap_button').hide();
		             return;
		         }
	          },
	          error:function(xhr, error, stauts){
	        	  console.log(xhr);
	        	  console.log(error);
	        	  console.log(status);
	          }
		   })
	   });    
	});

 

4. converter.StringHttpMessageConverter 가 String값만 처리하고 int는 처리를 못한다는 글을 보고 원래 int 형이었던 result 값을 String으로 바꿔주기 위해 mapper의  mysql쿼리에서부터 count(*) 를 varchar로 형변환해주고, Controller.java, Service.java, ServiceImpl.java, Mapper.java 에서도 각 메서드 및 return 값을 int 형에서 String 형으로 변경해주었다.

    <select id="checkId" parameterType = "String" resultType = "String">
       SELECT cast(COUNT(*) AS VARCHAR(10)) cnt FROM tbl_member WHERE id = #{id}
    </select>​

 

int 형으로 처리해주는 Converter 가 있다면 이러한 형변환 과정 필요없을 것 같은데, 한참 구글링을해도 잘 보이지 않았다.ㅜㅜ
p.s.)  누구 아시는분 계시면 댓글좀요..ㅠㅠ