0

こんにちは、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());
    }
 } 

これは、別の ObjectMapper (これではない) から使用される注釈を含む私の UserHeader クラスです。

  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)

USE_ANNOTATION false config のために @Annotations を無視する必要があるため、この例外についてはわかりません。さらに、USE_ANNOTATION を true に設定すると、エラーが消えます。ビルドパスにこれらの jar があります。

  • jackson-core-asl-1.8.3.jar
  • ジャクソン-jaxrs-1.8.3.jar
  • ジャクソン-マッパー-asl-1.8.3.jar
  • jackson-xc-1.8.3.jar
4

1 に答える 1

3

DeserializationConfig.Feature.USE_ANNOTATIONS プロパティ (false に設定) を使用すると、JACKSON DeserializerConfig クラスが NopAnnotationIntrospector を使用するようになります。クラスのアノテーションは、この NopAnnotationIntrospector を使用して解決されます。NopAnnotationIntrospector は、クラスの注釈に対する isHandled リクエストごとに false を返します。実際、この注釈は以降の処理では使用されません。

そのため、システムは引き続き注釈を「検査」します。この場合、注釈はクラスパス上にある必要があります。Android は jaxb-api アノテーションを提供しないため、これは NoClassDefFoundError につながります。

USE_ANNOTATIONS = false を使用すると、JACKSON が注釈を完全に無視するようになると予想していましたが、残念ながらそうではありません。ここでは、JACKSON データ バインディング機能を使用する代わりに、Jackson Streaming API を使用して JSON 文字列を解析します。

于 2012-05-02T17:07:44.497 に答える