2017년 1월 25일 수요일

jackson spring 4

spring 3.2 이상에서 사용할 수 있는 messageConverter 방법
오늘 json 데이터를 가져오는 방법을 코드로 짜보면서 도움이 될 거 같아 정리했다.
servlet.xml 에 보면 "컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 1" 과
"컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2" 가 있다.
원하는 방법으로 사용하면 된다.

아래는 Ref는 AnnotationMethodHandlerAdapter가 deprecated 된 이유를 알 수 있는 좋은 블로그가 있어서 참조했다.

Description Ref :)
http://javaiyagi.tistory.com/357
Spring 3.0 의 DefaultAnnotationHandlerMapping 과 AnnotationMethodHandlerAdapter가  Spring 3.1 에선 @Deprecated 되고, 대신 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter 로 바뀌었다.
 이유인즉슨, Controller 의 요청이 메소드 단위로 세분화 되면서 , DefaultAnnotationHandlerMapping 이 AnnotationMethodHandlerAdapter로 handler 를 전달해줄 때, 문제가 생겼기 때문이다 .


pom.xml
<dependency>    <groupId>org.codehaus.jackson</groupId>    <artifactId>jackson-core-asl</artifactId>    <version>1.9.13</version></dependency>
<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>
<dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-core</artifactId>    <version>2.5.1</version></dependency>
<dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-annotations</artifactId>    <version>2.5.1</version></dependency>


servlet.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:util="http://www.springframework.org/schema/util"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-3.2.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd        http://www.springframework.org/schema/util      http://www.springframework.org/schema/util/spring-util-3.2.xsd">
    <context:component-scan base-package="com.springapp.mvc" />
    <!--        JSR-303 support will be detected on classpath and enabled automatically    -->    <mvc:annotation-driven>        <!-- 컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 1 -->        <!--<mvc:message-converters>-->            <!--<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">-->                <!--<property name="supportedMediaTypes" value="application/json" />-->            <!--</bean>-->        <!--</mvc:message-converters>-->    </mvc:annotation-driven>
    <!-- 컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">        <property name="messageConverters">            <util:list list-class="java.util.ArrayList">                <ref bean="mappingJackson2HttpMessageConverter"/>            </util:list>        </property>    </bean>    <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="supportedMediaTypes">            <list>                <value>text/html;charset=UTF-8</value>                <value>application/json;charset=UTF-8</value>            </list>        </property>    </bean>

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

브라이언7 2015.03.26 13:17

SpringMVC에서 Ajax와 JSON


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

[목차]
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 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>


출처: http://bryan7.tistory.com/458 [민서네집]

댓글 없음:

댓글 쓰기