7

私たちのプロジェクトの 1 つで、MongoDB インスタンスと通信する Java Web アプリケーションを使用しています。データベースではDBRefs、いくつかのオブジェクトの関係を追跡するために使用します。jackson (mongodb-jackson-mapper を使用) を使用して、POJO オブジェクトを (デ) シリアライズします。

ただし、同じ POJO を使用して外部に (デ) シリアライズし、そこでフロント エンドが JSON の表示を処理します。

ここで、オブジェクト全体ではなくデータベースにDBRef書き込みたいのは明らかですが、(UI が完全なオブジェクトを表示できるように)から参照されたオブジェクトを含む外部世界のシリアライゼーションの方法が必要です。DBRef

現在、テストされていない静的なネストされたクラス コードをいくつか書きました。

public static class FooReference {
    public DBRef<Foo> foo;

    // FIXME how to ensure that this doesn't go into the database?
    public Foo getFoo() {
        return foo.fetch();
    }
}

理想的には、これに注釈を付けて、おそらくいくつかの構成オブジェクトに応じて、 getFoo() 結果の有無にかかわらずシリアル化 (逆) できるようにしたいと考えています。これは可能ですか?これを行うためのより良い方法はありますか?

4

2 に答える 2

8

オプションを見ると、プロパティに注釈を付けて、指定されたものがシリアライゼーションViewに使用された場合にのみ表示されるように思えます。ObjectMapperしたがって、クラスを編集できます。

public static class FooReference {
    public DBRef<Foo> foo;

    @JsonView(Views.WebView.class)
    public Foo getFoo() {
        return foo.fetch();
    }
}

以下を提供します。

class Views {
    static class WebView { }
}

正しいビューで構成を作成した後、シリアル化します。

SerializationConfig conf = objectMapper.getSerializationConfig().withView(Views.WebView.class);
objectMapper.setSerializationConfig(conf);

次に、それをシリアル化します。MongoDB ラッパーでシリアル化するときにビューを指定しないと、メソッドが無視されることになります。JsonView アノテーションのないプロパティは、デフォルトでシリアル化されます。この動作は、次を指定することで変更できます。

objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);

詳細については、Jackson Wiki を参照してください。

クラス自体を変更せずに、クラスの一部のシリアル化動作をオーバーライド (逆) できるJackson MixInsがあり、Jackson 2.0 (ごく最近のリリース) の時点でフィルターがあります。 、 それも。

于 2012-08-27T12:48:40.097 に答える
2

カスタムを使用して、メソッドJSONSerializerにロジックを適用します。serialize

public static class FooReference {
    public DBRef<Foo> foo;

    @JsonSerialize(using = CustomSerializer.class)
    public Foo getFoo() {
        return foo.fetch();
    }
}

public class CustomSerializer extends JsonSerializer<Object> {
   public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
       throws IOException, JsonProcessingException {
     // jgen.writeObjectField ...
   }
}
于 2012-08-27T12:10:47.133 に答える