> Hello World !!!

     

@syaku

Spring 3.2.x 에서 Jackson (JSON) 오류 : JsonTypeInfo

written by Seok Kyun. Choi. 최석균


Spring 3.2.x 에서 Jackson (JSON) 오류 : JsonTypeInfo


개발환경

Mac OS X 10.9.4
JAVA 1.6
Apache Tomcat 7.x
Spring 3.2.12
Spring Tool Suite 3.5.1
Maven 2.5.1


발생 원인

Spring 3.1.1 인 경우 정상적으로 json 을 출력한다. 다만 버전을 3.2.x 로 업데이트한 경우 문제가 발생한다.
Spring 3.2.x 인 경우 Jackson2 가 필수 사항이기 때문이다..

<com.fasterxml.jackson-version>2.1.0</com.fasterxml.jackson-version>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>

업데이트 후 다시 실행하니 400 Bad Request 에러가 발생한다.

오류를 정확한 확인하기 위해 @ExceptionHandler 를 컨트롤러에 추가한다.

@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public ResultResponse handleException(HttpMessageNotReadableException ex, WebRequest request) {
    logger.info(ex.getMessage());
    Throwable t = ex.getCause();
    if (t != null && t instanceof InvalidFormatException) {
        InvalidFormatException ife = (InvalidFormatException) t;
        for (Reference r : ife.getPath()) {
            logger.info(r.getFieldName());
        }
        logger.info("type= " + ife.getTargetType().getName());
        logger.info("value=" + ife.getValue());
    }

    return new ResultResponse();
}

아래와 같은 오류가 출력되었다.

could not read json can not instantiate value of type …
abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

해결

@JsonTypeInfo 어노테이션을 사용하여 세분화의 주석을 작성해주면 된다.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Post {

    ...

    private UserInfo user_info;

}

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "@class")
public interface UserInfo {
    ...
}

참고

http://www.studytrails.com/java/json/java-jackson-Serialization-polymorphism.jsp
http://wiki.fasterxml.com/JacksonPolymorphicDeserialization

posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.

http://syaku.tistory.com