7

私は Jackson 2.0 mixin を使って、注釈なしでクラスをシリアライズしようとしていました。

以下、簡略化したソースコード。私はゲッター/セッターを使用していないことに注意してください

public class NoAnnotation {
   private Date created;
   private String name;

   // make one with some data in it for the test
   static NoAnnotation make() {
      NoAnnotation na= new NoAnnotation();
      na.created = new Date();
      na.name = "FooBear";
      return na;
   }

   // my Mixin "class"
   static class JacksonMixIn {
      JacksonMixIn(@JsonProperty("created") Date created,
                   @JsonProperty("name") String name)
         { /* do nothing */ }
   }

   // test code
   public static void main(String[] args) throws Exception {
      NoAnnotation na = NoAnnotation.make();
      ObjectMapper objectMapper = new ObjectMapper();
      objectMapper.addMixInAnnotations(NoAnnotation.class, JacksonMixIn.class);
      String jsonText = objectMapper.writeValueAsString(na);
      System.out.println(jsonText);
   }
}

main を実行すると、

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.flyingspaniel.so.NoAnnotation and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) )
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:51)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:25)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:108)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2407)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:1983)
    at com.flyingspaniel.so.NoAnnotation.main(NoAnnotation.java:49)

例外の指示に従って行を追加すると

objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

例外は発生しなくなりましたが、結果は空の JSON オブジェクト{}.

フィールドをパブリックにすればうまくいきますが、それは合理的なオブジェクト設計ではないので、私がやりたいことではありません。

基本的な「setThis」ステップをどこかで省略していると思いますが、何がわかりません。この状況でミックスインを機能させるにはどうすればよいですか?

4

3 に答える 3

7

アノテーションミックスインを正しい方法で使用して宣言する場合は、次のようになります。

static class JacksonMixIn {
    @JsonProperty Date created;
    @JsonProperty String name;
}

このようにすると、フィールドを制御して、ミックスインにフィールドを含める/除外するだけでシリアル化できます。

于 2012-06-08T18:48:25.773 に答える
6

私はそれを考え出した。プライベート フィールドにアクセスする場合は、次の行を追加して可視性を操作する必要があります。

objectMapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance()
        .withFieldVisibility(Visibility.ANY));

保護されたフィールドの場合、 も使用できますVisibility.PROTECTED_AND_PUBLIC

完全な例

// test code
public static void main(String[] args) throws Exception {
   NoAnnotation na = NoAnnotation.make();
   ObjectMapper objectMapper = new ObjectMapper();
   objectMapper.addMixInAnnotations(NoAnnotation.class, JacksonMixIn.class);
   objectMapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance()
           .withFieldVisibility(Visibility.ANY));
   String jsonText = objectMapper.writeValueAsString(na);
   System.out.println(jsonText);
}
于 2012-06-07T22:43:13.497 に答える