2016-05-13 13 views
2

バックエンドサービスを使用してMetricオブジェクトのリストを取得するフロントエンドサービスがあります。私たちはバックエンドサービス用のJava ClientSDKを作成し、そのサービスのクライアントアプリケーションの開発を容易にしました。JavaオブジェクトのサブセットをJSONに公開

また、フロントエンドサービスからのメトリックのリストも公開しています。今のところ、バックエンドのMetricオブジェクトを直接公開してJSONに変換しています。

バックエンドのMetricオブジェクトが変更された場合(開発者が新しい秘密IDフィールドを追加するなど)、フロントエンドサービスから公開したくないことが懸念されます。

フロントエンドサービス用のclientSDKも作成しています。バックエンドのclientSDKからMetricクラスを参照したくないので、論理的な選択肢は、フロントエンドSDKで同様のMetricオブジェクトを定義することです。

私は、あるクラス定義から別のクラス定義に1000のメトリックをコピーするCPUサイクルを無駄にしたくありません。

バックエンドメトリックからJSONに変換する際のメトリックのフロントエンド定義に公開するフィールドを指定する方法はありますか?さらに、バックエンドオブジェクトをマーシャリングするように依頼するので、フロントエンドの定義をJSONコンバータに参照することはできますか?

私たちは、Spring restフレームワークでコンテキストを使用していますが、注釈を使用してオブジェクトをマーシャリングすることがこの問題の根本的な原因であると思われるため、ハートビートでそれを削除してうれしいです。

答えて

3

Jackson's JsonViewの構成を見てください。

私はこのような何かを探して、あなたの例を見ることができます:

class Views { 
    static class Client {} 
    static class Backend extends Client {} 
} 

public class Metric { 
    @JsonView(Views.Client.class) String metricName; 
    @JsonView(Views.Client.class) String count; 
    @JsonView(Views.Backend.class) String secretKey; 
} 

@JsonView注釈が春@ResponseBodySpring 4.1のように注釈を付けた方法でサポートされています。

+0

OPの正確な設定に依存して容易に選択かもしれません '@ JsonIgnore'アノテーションは、もあります。 – ingenious

0

Nicholas Hausschildは、マーシャリング/アンマーシャリングフレームワークのアノテーションによってこれを実現できることを示唆しています。

あなたは単に継承し、次のようにキャストを使用することができますしかし:

class SomeSuperClass { 
    String exposeThis; 
    String exposeThat; 
    // getters and setters... 
} 

class SomeSubClass extends SomeSuperClass { 
    String doNotExposeThis; 
    // getters and setters... 
} 

あなたはJSONパーサーにオブジェクトを返すときにスーパークラスにキャストし、同時にに内部的にサブクラスを使用することができます。この方法あなたが実際に公開したくない追加情報を運びます。

0

もう1つの可能性はMixinsです。したがって、元のDTOに触れることなく、さまざまなシナリオを定義することができます。

私は自分自身を動的にこれを達成するために私が書いたライブラリを使用します。

https://github.com/Antibrumm/jackson-antpathfilter

これは深すぎないグラフに適しています、他の誰かがこれらのために、よりパフォーマンスの高いと思われる、ここで同様の方法で、別のアプローチを書きましたシナリオは少し違っています。

https://github.com/krishna81m/jackson-nested-prop-filter

関連する問題