2012-05-02 3 views
0

안녕하세요, 저는 ObjectMapper 클래스로 Jackson JSON PRocessor를 사용하는 중에 심한 문제에 직면하고 있습니다. 이것은 Object (UserHeader)를 Json String으로 serialize해야하는 테스트 클래스입니다.Jackson JSON 프로세서 : SerializationConfig.Feature.USE_ANNOTATIONS가 false로 설정되었습니다.

import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializationConfig; 

public class TestJson { 

    public static void main(String[] args) throws Exception { 
      ObjectMapper mapper = new ObjectMapper(); 
      UserHeader userHeader = new UserHeader(); 
      userHeader.setFirstName("A"); 
      userHeader.setLastName("A1"); 
      userHeader.setSystem("2A"); 

      mapper.configure(SerializationConfig.Feature.USE_ANNOTATIONS, false); 
      StringWriter sw = new StringWriter(); 
      mapper.writeValue(sw, userHeader); 
      System.out.println(sw.toString()); 
    } 
} 

이 나는 ​​시스템이 나에게이 예외를 반환하는 주요 방법을 실행하면 다른 ObjectMapper (안이 하나) 그러나

import org.codehaus.jackson.annotate.JsonIgnore; 
    import org.codehaus.jackson.annotate.JsonProperty; 
    import org.codehaus.jackson.map.annotate.JsonSerialize; 
    import org.codehaus.jackson.map.annotate.JsonSerialize.Typing; 

    @JsonSerialize(typing=Typing.STATIC) 
    public class UserHeader implements Serializable,LoggedObject, MessagesInterface { 

    private static final long serialVersionUID = 1L; 

    private String system; 
    private String userName; 
    private String firstName; 
    private String lastName; 

     private List<Scrivania> scrivanie; 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
    this.userName = userName; 
    } 

     @JsonProperty("Nome utente") 
    public String getFirstName() { 
    return firstName; 
    } 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 

    @JsonProperty("Cognome utente") 
    public String getLastName() { 
    return lastName; 
    } 
    public void setLastName(String lastName) { 
    this.lastName = lastName; 
    } 

     @JsonProperty("Scrivanie associate") 
    public List<Scrivania> getScrivanie() { 
    return scrivanie; 
    } 
    public void setScrivanie(List<Scrivania> scrivanie) { 
    this.scrivanie = scrivanie; 
    } 
    @JsonProperty("Sistema (IAM o EDOC)") 
    public String getSystem() { 
    return system; 
    } 
    public void setSystem(String system) { 
    this.system = system; 
    } 

    @Override 
    @JsonIgnore 
    public String getObjectId() { 
    return this.userName; 
    } 

    @Override 
    @JsonIgnore 
    public Object getObjectData() { 
    try { 
     return this.clone(); 
    } 
    catch (Exception e) { 
     return null; 
    } 
    } 
    @Override 
    public String getName() { 
    return this.userName; 
    } 
    } 

에서 사용되는 주석 내 UserHeader 클래스입니다 :

Exception in thread "main" java.lang.NullPointerException 
at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveClassAnnotations(AnnotatedClass.java:295) 
     at org.codehaus.jackson.map.introspect.AnnotatedClass.construct(AnnotatedClass.java:141) 
     at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forClassAnnotations(BasicClassIntrospector.java:185) 
     at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forClassAnnotations(BasicClassIntrospector.java:15) 
     at org.codehaus.jackson.map.SerializationConfig.introspectClassAnnotations(SerializationConfig.java:661) 
     at org.codehaus.jackson.map.ser.BasicSerializerFactory.createTypeSerializer(BasicSerializerFactory.java:180) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory.findPropertyContentTypeSerializer(BeanSerializerFactory.java:406) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory._constructWriter(BeanSerializerFactory.java:778) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory.findBeanProperties(BeanSerializerFactory.java:608) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory.constructBeanSerializer(BeanSerializerFactory.java:436) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory.findBeanSerializer(BeanSerializerFactory.java:349) 
     at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:295) 
     at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:778) 
     at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:731) 
     at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:369) 
     at http://stackoverflow.com/questions/6661717/how-to-process-an-invalid-value-with-jackson-json-processororg.codehaus.jackson.map.ser.StdSerializerProvider.findTypedValueSerializer(StdSerializerProvider.java:452) 
     at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:597) 
     at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:280) 
     at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:2260) 
     at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1813) 
     at it.unina.edoc.json.TestJson.main(TestJson.java:65) 

USE_ANNOTATION false config로 인해 @Annotations가 무시되어야하므로이 예외에 대해서는 전혀 알지 못합니다. 또한 USE_ANNOTATION을 true로 설정하면 오류가 사라집니다.

  • 잭슨 코어-ASL-1.8.3.jar
  • 잭슨-jaxrs-1.8.3.jar
  • 잭슨 - 매퍼 - ASL-1.8.3 : 나는 나의 buildpath에이 병을 가지고 .JAR
  • 잭슨-XC-1.8.3.jar는

답변

3

(false로 설정)을 DeserializationConfig.Feature.USE_ANNOTATIONS 재산의 사용 NopAnnotationIntrospector를 사용하는 JACKSON DeserializerConfig 클래스의 원인이됩니다. 클래스의 주석은이 NopAnnotationIntrospector를 사용하여 해결됩니다. NopAnnotationIntrospector는 클래스의 모든 주석에 대한 isHandled 요청마다 false를 반환합니다. 실제로이 주석을 이후 처리에 사용하지는 않습니다.

그래서 시스템은 여전히이 경우 클래스 패스에 있어야하는 주석을 "조사"합니다. Android는 jaxb-api 주석을 제공하지 않으므로 NoClassDefFoundError가 발생합니다.

나는 USE_ANNOTATIONS = false가 JACKSON이 주석을 완전히 무시할 것으로 예상했지만, 불행히도 주석을 무시하지는 않습니다. 이제 잭슨 스트리밍 API를 사용하여 JACKSON 데이터 바인딩 기능을 사용하는 대신 JSON 문자열을 구문 분석합니다.

관련 문제