Jackson JSON处理器:SerializationConfig.Feature.USE_ANNOTATIONS设置为false

时间:2012-05-02 16:58:18

标签: java linux json jackson

嗨我在使用带有ObjectMapper类的Jackson JSON PRocessor时遇到了一个令人讨厌的问题。 这是我的测试类,应该将对象(UserHeader)序列化为Json字符串。

 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());
    }
 } 

这是带有Annotations的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;
    }
    }

但是如果我运行main方法,系统会返回给我这个例外:

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
  • jackson-mapper-asl-1.8.3.jar
  • 杰克逊-XC-1.8.3.jar

1 个答案:

答案 0 :(得分: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数据绑定功能。