2012-05-02 27 views
0

嗨我正面臨一個令人討厭的問題,同時使用Jackson JSON PRocessor與ObjectMapper類。 這是我的測試類,應該將對象(UserHeader)序列化爲Json字符串。傑克遜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()); 
    } 
} 

這是我UserHeader類與從不同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; 
    } 
    } 

不過使用,如果我運行系統返回到我此異常的主要方法註釋:

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) 

我不知道這個異常,因爲@Annotations應該由於USE_ANNOTATION false config而被忽略。 此外,如果我將USE_ANNOTATION設置爲true,則錯誤消失。 我有我的構建路徑,這些罐子:

  • 傑克遜核心ASL-1.8.3.jar
  • 傑克遜JAXRS-1.8.3.jar
  • 傑克遜映射器-ASL-1.8.3的.jar
  • 傑克遜-XC-1.8.3.jar

回答

3

的DeserializationConfig.Feature.USE_ANNOTATIONS屬性(設置爲false)的使用將導致JACKSON DeserializerConfig類使用NopAnnotationIntrospector。然後使用這個NopAnnotationIntrospector解決一個類的註釋。 NopAnnotationIntrospector將在每個isHandled請求上爲任何類的註釋返回false - 實際上不會在進一步處理中使用該註釋。

所以 - 系統仍然「檢查」註釋 - 在這種情況下必須在Classpath上。由於Android不提供任何jaxb-api註釋,這會導致NoClassDefFoundError。

我預計USE_ANNOTATIONS = false會使JACKSON完全忽略任何註釋 - 但不幸的是它沒有。我現在將使用Jackson Streaming API來解析JSON字符串,而不是使用JACKSON數據綁定功能。