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