SPRING에서 JSON 객체를 파라메터로 넘겼을 경우 처리
SPRING에서 PARAMETER로 JSON을 던져서 처리하는 것을 연습삼아 하게 되었다.
삽질의 연속이었다.-_-
JSP파일에서는 JQUERY 의 $.ajax를 사용하였다.
data 속성에 담아서 보냈는데 data에 담을 경우 알아서 queryString으로 파싱을 하게 된다.
(queryString : type=sfa&name=3234&id=1324142 형식)
그래서 JSON.stringify 함수를 통해서 JSON문자열로 만든 후 이를 data에 담아서 보냈다.
그리고 Spring에 JSON으로 보낸다는 것을 인식시키기 위해 contentType을 application/json;charset=UTF-8 로 보내야 한다.
그렇지 않을 경우 415 415 unsupported media type 에러를 받아볼 수 있을 것이다.(제길-_-)
소스
var jsonStr = JSON.stringify(pObj);
console.log("jsonStr : " + jsonStr);
url : '/app/adm/menu/modify'
, method : "post"
, dataType : 'json'
, data : jsonStr
, processData : true /*querySTring make false*/
, contentType : "application/json; charset=UTF-8"
, success : function(data, stat, xhr) {
alert("success");
}
, error : function(xhr, stat, err) {
alert("error");
console.log(err);
}
});
spring셋팅에서 @annoatation-drriven 을 사용하였기에 MessageConvert에 자동으로 JacksonJson 이 추가된다고 알고 있었다.
근데 이것도 pom.xml 에 jacksonJson mapper lib가 추가되었을 경우 해당한다.
(jackson json lib 버젼의 경우 1.9.x 도 되는듯 하나 그냥 최신버젼으로 하였다.)
(스프링 doc에 3.1.2 부터 가능하다고 하는 이야기도 있다. 안될 경우 spring버젼을 3.1.2 이상으로 하자.)
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
</dependency>
spring 의 controller 부분에서는 paremeter 로 json을 받기 위해 controller의 arg 부분에 @requestBody 를 추가하였다.
또한 return 을 json으로 하기 위해 @responseBody를 추가하였다.
controller의 argument, return 값이 대한 설명 참고 url
http://springsource.tistory.com/13
또한 json 으로 넘겨받은 것을 jackson json lib 가 자동으로 convert 시 리턴값을 List<LinkedHashMap> 형태로 반환한다고 한다.
(나같은 경우 json 기준 [{}, {}, {}] 구조임)
여기서도 domain 객체로 받는 것으로 처리해놨다가 엄청 삽질하고 구글링 통해 포기했다.-ㅅ-;;
@RequestMapping("modify")
@ResponseBody
public String modify(@RequestBody List<Map<String, Object>> list) {
logger.debug("modify");
logger.debug("param : " + list);
ArrayList<Menu> menuList = new ArrayList<Menu>();
for(Map<String, Object> m : list) {
logger.debug("menu : " + m);
Menu menu = new Menu();
menu.setSeq(Long.parseLong(m.get("seq").toString()));
menu.setMenuName(m.get("menuName").toString());
menu.setMenuUrl(m.get("menuUrl").toString());
menu.setpSeq(Long.parseLong(m.get("pSeq").toString()));
menuList.add(menu);
}
menuService.insertMenu(menuList);
return "{}";
}
일단 이렇게 해서 json객체를 spring에서 받는 부분을 처리하였다.
json ajax 처리 시 오류난 이유
http://www.okjsp.net/seq/218107
@requestBody 관련 참고자료
http://www.leveluplunch.com/java/tutorials/014-post-json-to-spring-rest-webservice/
http://springsource.tistory.com/13
http://stackoverflow.com/questions/6019562/parsing-json-in-spring-mvc-using-jackson-json