Процессор JSON Джексона: для SerializationConfig.Feature.USE_ANNOTATIONS установлено значение false

Привет, я столкнулся с неприятной проблемой при использовании Jackson JSON PRocessor с классом ObjectMapper. Это мой тестовый класс, который должен сериализовать объект (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());
    }
 } 

Это мой класс 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. Более того, если я установлю для USE_ANNOTATION значение true, ошибка исчезнет. У меня на пути к сборке есть эти банки:

  • Джексон-ядро-asl-1.8.3.jar
  • Джексон-Джаксрс-1.8.3.jar
  • Джексон-маппер-asl-1.8.3.jar
  • Джексон-xc-1.8.3.jar

person user1370544    schedule 02.05.2012    source источник


Ответы (1)


Использование свойства DeserializationConfig.Feature.USE_ANNOTATIONS (установленное в false) заставит класс JACKSON DeserializerConfig использовать NopAnnotationIntrospector. Аннотации класса затем будут разрешены с помощью этого NopAnnotationIntrospector. NopAnnotationIntrospector будет возвращать false при каждом запросе isHandled для любой аннотации в классе - и фактически не будет использовать эту аннотацию в дальнейшей обработке.

Итак, система по-прежнему «проверяет» аннотации, которые в этом случае должны находиться в пути к классам. Поскольку Android не предоставляет аннотаций jaxb-api, это приводит к ошибке NoClassDefFoundError.

Я ожидал, что USE_ANNOTATIONS = false приведет к тому, что JACKSON полностью проигнорирует любые аннотации, но, к сожалению, это не так. Теперь я буду использовать Jackson Streaming API для анализа строки JSON вместо использования возможностей привязки данных JACKSON.

person Community    schedule 02.05.2012