2011-10-31 3 views
0

Jackson을 사용하여 JAXB 주석 객체를지도 객체로 직렬화합니다. 이것은 다음과 같은 오류가 발생Jackson을 사용하여 개체를 기본 입력을 사용하여 매핑하는 방법은 무엇입니까?

public class Test { 

    @XmlAccessorType(XmlAccessType.NONE) 
    public static class Inner { 
     @XmlAttribute 
     public int foo; 
    } 

    @XmlAccessorType(XmlAccessType.NONE) 
    public static class Outer { 
     @XmlAttribute 
     public String bar; 

     @XmlElement 
     public Inner in; 
    } 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = getMapper(); 

     mapper.enableDefaultTyping(); 

     Inner in = new Inner(); 
     in.foo = 42; 
     Outer out = new Outer(); 
     out.in = in; 
     out.bar = "thecakeisalie"; 

     Object o = mapper.convertValue(out, TreeMap.class); 
     System.out.println(o); 
    } 

    public static ObjectMapper getMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); 
     mapper.setAnnotationIntrospector(introspector); 
     return mapper; 
    } 
} 

:

{bar=thecakeisalie, in={foo=42}} : 라인 mapper.enableDefaultTyping();은, 코드 작업을 생략하는 경우

Exception in thread "main" java.lang.IllegalArgumentException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object 
at [Source: N/A; line: -1, column: -1] 
    at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2493) 
    at org.codehaus.jackson.map.ObjectMapper.convertValue(ObjectMapper.java:2459) 
    at com.example.test.Test.main(Test.java:49) 
Caused by: org.codehaus.jackson.map.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object 
at [Source: N/A; line: -1, column: -1] 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.wrongTokenException(StdDeserializationContext.java:261) 
    at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer._locateTypeId(AsArrayTypeDeserializer.java:100) 
    at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:86) 
    at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:69) 
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserializeWithType(UntypedObjectDeserializer.java:106) 
    at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:321) 
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249) 
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33) 
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) 
    at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2489) 
    ... 2 more 

다음에 출력 여기 내 문제를 설명하는 몇 가지 코드는

매퍼를 사용하여 json으로 직렬화하면 기본 입력으로 작동합니다.

기본 입력이 개체 변환과 호환되지 않습니까, 아니면 잘못 사용합니까?

답변

2

확인. 응. 이 문제는 일종의 호환되지 않는 사용법에서 비롯됩니다. 직렬화 할 때 기본 입력은 해당 구성에 따라 형식 정보 만 추가하며이 경우 형식 정보는 포함되지 않습니다 (유형은 추상이 아니며 java.lang으로 선언되지 않습니다. 목적). 그러나 (변환의 일부로) 비 직렬화 할 때 결과 유형은 유형 정보를 예상합니다. 공칭 유형은 TreeMap<Object,Object>이므로; 그리고 그것은 예외가 나오는 곳입니다.

그러나 본질적으로 "유형이없는"유형 인지도로 변환하기 때문에 기본 입력을 사용하지 않는 것이 가장 좋습니다. 그 유형 정보는 어쨌든 폐기됩니다.

또는 실제로 포함 된 유형 정보를 보려면 2 단계 처리가 필요합니다. 기본 입력을 사용하도록 설정 한 직렬화 (활성화 된 맵퍼 사용) 및 기본값이있는 ObjectMapper와 함께 트리 맵으로 직렬화 해제하십시오. 입력이 비활성화되었습니다.

관련 문제