AJAX를 통해 페이지 이동 없이 컨트롤러에 데이터를 전달해 SQL 쿼리문을 돌려 결과값을 가져오려고 했다.
문제: 자꾸 "406 받아들일 수 없음" 에러 발생
컨트롤러로 보내는 데이터를 JSON 형태로 보내서 받을 때도 JSON 형태로 받으려고 했다.
406에러는 response에서 응답이 올 때 request가 기대하는 데이터 형태와 다를 때 발생하는 에러라고 한다.
$.ajax({
url : "chkReservation1.do",
type : "get",
data : {
},
async : true,
dataType: "json",
success : function(data){
},error: function(xhr, status, error) {
console.log("AJAX Error:", xhr.responseText);
console.log("Status:", status);
console.log("Error:", error);
}
});
ajax의 코드이고
@RequestMapping(value = "/chkReservation1.do", method = RequestMethod.GET)
컨트롤러의 코드이다.
해결방법 :
1. 컨트롤러에 @ResponseBody 어노테이션 추가
- 컨트롤러의 method = RequestMethod.GET 옆에 produces="application/json")을 추가
개발자 도구의 Network >> Response >> Headers >> Content-type이 application/json 으로 바뀐다고 한다. 과연..!!
- pom.xml에 jackson 의존성을 추가
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.8.5</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.8.5</version> </dependency>
(저는 spring framework 3.1.1 버전을 쓰고 있어서 가장 호환이 잘된다는 1.8.5버전을 썼습니다!)
이것 말고도 몇 개 더 있었는데 정말 다 해봤는데도
개발자 도구의 Network>>Response>>Headers에 Content-type이 application/JSON로 바뀌지 않고 text/html로 그대로인 것이다..ㅠㅠ
정말 계속 새로고침도 해보고, 캐시도 지우면서 오만 짓을 다해봤는데도 안됐다..
그러다 팀원이 pom.xml의 내용을 변경한 채 커밋을 하셨고, pom.xml을 변경한 후에는 메이븐 업데이트를 해줘야한다는 말씀을 하셨다.
?! 나는 정말 전혀 몰랐다..
그 말을 듣고 바로 메이븐 업데이트를 해봤는데 ...
정말 너무나도 이쁘게 AJAX로 JSON 데이터가 넘어왔다...😂😂
진짜 이틀동안 이것 때문에 매일 12시간씩 갖다 바쳤는데..!!
이렇게 허무하게 에러가 해결될 줄이야..
찾아보니 결국 @ResponseBody를 넣는 것도 맞고 Jackson 의존성도 추가하는게 맞다고 한다. 하하..
결국은 메이븐 업데이트 하나 때문에 이 고생을 했다는..ㅠㅠㅠ
찐 해결방법
1. 컨트롤러에 @ResponseBody 추가하기
2. pom.xml에 Jackson 의존성 추가하기
3. Maven Update 하기
이클립스에서 프로젝트에 우클릭 >> Maven 선택 >> Update Project 선택
프로젝트 우클릭 >> Run As 선택 >> Maven Install 선택
개발자 도구의 Response Headers의 Content-Type을 보면 잘 바뀌어 있다..!!
앞으로는 pom.xml 변경하면 꼭 메이븐 업데이트도 하자..!!!