민서네집

[Spring Framework] JsonView 설정과 Spring 4.1에서 406 Error 대처법 본문

Spring

[Spring Framework] JsonView 설정과 Spring 4.1에서 406 Error 대처법

브라이언7 2015. 3. 26. 13:17

SpringMVC에서 Ajax와 JSON

http://www.nextree.co.kr/p11205/


여기가 가장 정리가 잘 되어 있었다. (감사합니다. 잘 보겠습니다.^^)


[목차]

1. response객체에 문자열 담기

2. ObjectMapper

3. @ResponseBody

4. jsonView


개인적으로는 @ResponseBody 에 담는 방법이 가장 간단하게 JsonView를 사용할 수 있는 방법이 아닐까 싶다.


Spring Framework 버전을 4.0.6.RELEASE 에서 가장 최근 버전인 4.1.6.RELEASE 으로 올렸더니,

@ResponseBody 를 이용한 JsonView의 응답이 406 Not Acceptable 에러가 난다.


406 Error - Not Acceptable


http://www.inmotionhosting.com/support/website/error-numbers/406-error


당황하며 구글링을 해 봤더니,

HTTP 406 Error Occured Upgrade to Spring MVC 4.1 Using JSON

http://stackoverflow.com/questions/26417895/http-406-error-occured-upgrade-to-spring-mvc-4-1-using-json


위에 쓰인 바와 같이 pom.xml 에서


<!-- Json View -->

<dependency>

   <groupId>org.codehaus.jackson</groupId>

   <artifactId>jackson-mapper-asl</artifactId>

   <version>1.9.13</version>

</dependency>


이렇게 사용하고 있었는데,


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.5.1</version>

</dependency>


위와 같이 바꾸어서 해결했다.


그런데 이런 에러가 갑자기 발생한 원인과 jackson-mapper-asl 라이브러리를 jackson-databind 라이브러리로 대체해도 되는가 하는 의문이 남는다.


먼저 이런 에러가 발생한 원인은...


Migrating from earlier versions of the Spring Framework


https://github.com/spring-projects/spring-framework/wiki/Migrating-from-earlier-versions-of-the-Spring-Framework#libraries


Jackson 1.8/1.9

All Jackson v1 support is deprecated in favor of Jackson v2 and has been removed in Spring Framework 4.1:

  • JacksonObjectMapperFactoryBean
  • MappingJacksonHttpMessageConverter
  • MappingJacksonJsonView
  • MappingJacksonMessageConverter for JMS
위에 쓰인 바와 같이 Spring 4.1 에서 Jackson 1.8/1.9의 지원을 중단해 버렸다.

이제 갑자기 JsonView로 요청 시 HTTP Status 406 Error 가 난 원인은 알았다.

그런데 아직 jackson-mapper-asl 라이브러리를 jackson-databind 라이브러리로 대체해도 되는가 하는 의문이 남았다. 


Jackson-mapper-asl 라이브러리를 mvnrepository.com 에서 찾아 보았다.




This artifact was moved to:

New Group   com.fasterxml.jackson.core

New Artifact  jackson-databind


라고 써 진 것이 눈에 띈다.

jackson-mapper-asl 라이브러리가 다른 Group의 jackson-databind 로 옮겨진 것이다.

이제 마음 놓고 pom.xml 을 수정하자.^^


jsonView Spring Framework 설정 파일 변경


Old Library

<!-- json result  -->

<bean id="jsonView" class="net.sf.json.spring.web.servlet.view.JsonView">

<!-- <property name="contentType" value="application/json;charset=UTF-8"/> -->

<property name="contentType" value="text/html; charset=UTF-8" />

</bean>


현재 방식

<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">

<!-- <property name="contentType" value="application/json;charset=UTF-8"/> -->

<property name="contentType" value="text/html;charset=UTF-8"/>

</bean>


나는 지금 Spring Framework Version 4.1.6 버전을 사용 중인데, Spring 설정 파일에 다음과 같이 net.sf.json.spring.web.servlet.view.JsonView 를 쓰기 위해 

pom.xml 파일에 json-lib-ext-spring 라이브러리를 사용하는 것은 Spring 4.1.6 버전에서 여러 다른 문제를 일으킨다.

(아마도 이 라이브러리에 따라오는 종속된 라이브러리 때문인 것 같다.)


pom.xml 에 다음을 추가하지 말 것!

<dependency>

<groupId>net.sf.json-lib</groupId>

<artifactId>json-lib-ext-spring</artifactId>

<version>1.0.2</version>

</dependency>


Comments