8、@JsonViewフィルタ応答本文のオブジェクト属性

18323 ワード

HTTP教程:https://www.w3cschool.cn/http/a96bxfml.html HTTP要求戻りインターフェースタイプ制御(Json/xml):https://www.cnblogs.com/dayou123123/p/8298917.html Http Message Coverter:https://www.jianshu.com/p/3e1de3d02dd8 この章のデモコード:https://gitee.com/tysite-web/tysite-service/tree/master/src/main/java/org/tysite/tyservice/example/jsonview
説明
前後で分離されたプロジェクトの中で、サービス端末インターフェースはWEBページのレンダリング作業に注目する必要はなく、業務データのフィードバックと状態情報フィードバックに専念して、フロントエンドの学生によってページレンダリングを完成させる必要があります。したがって、日常的な開発において、私たちはHTTP を通じて応答状態をマークし、本文に応答してインタフェースを通して情報をフィードバックする。より良いフォーマット応答情報のために、現在の主流の方式はJSONフォーマットで戻る。spring mvcは、要求ヘッダの@ResponseBodyパラメータ値に応じて、対応する応答変換器Acceptを呼び出して、要求結果オブジェクトを対応するフォーマットで応答体に書き込むことができます。
日常的に開発された作業では、通常は異なるビジネスシーンに遭遇し、同じ結果の対象が返すフィールド情報が異なる。例えば、ユーザ情報インターフェースに対して、管理端末が使用する場合、管理者が確認、修正するために、ユーザの携帯番号、身分証番号などの敏感な情報を返す必要がある。ユーザーが使う場合は、名前や顔写真などの非敏感な情報だけが必要です。2、管理リストに表示されるフィールド情報とデータ編集画面に表示されるデータも異なる。
Spring MVCは私達のために@JsonView注釈を提供して、結果の対象に対する再現フィールドのフィルタリング機能を実現して、本文は@Json Viewの使用と推奨の使い方を詳しく説明します。
一.依存追加
私たちのHttpMessageConverterプロジェクトの構築において、依存関係のあるtysite-serviceはすでにorg.springframework.boot:spring-boot-starter-webの依存関係を含んでいます。追加する必要はありません。8、@JsonView 过滤响应正文的对象属性_第1张图片は、com.fasterxml.jackson.core:jackson-databindフォーマットのデータを返すことを目標としているので、tysite-service依存を追加することができません。そうでなければ、chromeブラウザのデフォルトはjson形式で戻ります。
二.@JsonViewプロパティフィルタリングcom.fasterxml.jackson.dataformat:jackson-dataformat-xmlは、異なる属性フィルタ方式をxmlにより表示し、@JsonViewに対応するフィルタ方式を使用して、所望の要求体JSONデータを得る。上記の Controllerであっても良いし、 であっても良いです。著者らは、 classを用いてフィルタリング方式を定義することを提案するinterface
具体的な実現案は以下の通りである。
第1のステップは、結果セットとしてオブジェクトに戻るPOJOにおいて、トラフィック要件に応じて をクラス識別として定義する。
……
    public interface ListView {}
    public interface DetailView extends ListView{}
……
注意:クラスマークは継承関係をサポートしていますが、サブクラスに属性が注釈されていれば、親クラスに相当します。
二番目のステップは、業務の需要に応じて、@JsonViewを通じて関連する属性を注釈します。
……
    /**      */
    @JsonView({ListView.class})
    private Integer id;
    /**      */
    @JsonView({ListView.class})
    private String name;
    /**      */
    @JsonView({DetailView.class})
    private String password;
……
デモ対象のソースコードの住所:JsonView InfoDT
第三段階、Controllerインターフェースの注釈を完成します。
……
   @GetMapping("/list")
   @JsonView(JsonViewInfoDTO.ListView.class)
   public JsonViewInfoDTO demoList() {
       return jsonViewService.getJsonViewInfo();
   }
   
   @GetMapping("/detail")
   @JsonView(JsonViewInfoDTO.DetailView.class)
   public JsonViewInfoDTO demoDetail() {
       return jsonViewService.getJsonViewInfo();
   }
……
デモControllerソースアドレス:Json View Controller
ステップ4で、アイテムを起動し、それぞれリストと詳細インターフェースを呼び出して、応答体の属性フィルタ効果を確認します。呼び出し: インターフェース8、@JsonView 过滤响应正文的对象属性_第2张图片呼び出し:POJO インターフェース8、@JsonView 过滤响应正文的对象属性_第3张图片以上、 クラスの識別された応答体は/api/example/json-view/listクラスの識別された応答体よりも多く/api/example/json-view/detail属性に戻りました。このスキームは、同じJsonViewInfoDTO.DetailView.classクラスで応答オブジェクトとしている場合の属性フィルタリングを実現する。
三.@JsonViewオブジェクトタイプの属性フィールド処理
注意深い読者は、上記の2つのスクリーンショットでは、JsonViewInfoDTO.ListView.classpasswordのプロパティが正常にデータに戻りませんでしたが、空のオブジェクトPOJOです。これは、typsのデフォルトは、attributeのオブジェクト属性のみを{}にプロビジョニングすることができるからである。@JsonViewのオブジェクト属性は、 を介してJSONに注釈を付けて指定する必要がある。
ここで著者らは、 @JsonSerializeの2つのオブジェクトタイプを例に挙げて、 の使い方を説明する。
1、Json View TypeDTMタイプの属性序列化方案
第1のステップは、JsonViewTypeDTOクラスのListパッケージの下で@JsonSerializeパッケージを作成し、JsonViewTypeDTO.javaのJsonプログレッシブ処理クラスを作成します。
public class JsonViewTypeSerializer extends JsonSerializer<JsonViewTypeDTO> {       (1)

    @Override
    public void serialize(JsonViewTypeDTO value, JsonGenerator gen, SerializerProvider serializers) throws IOException {    (2)
        gen.writeStartObject();
        gen.writeNumberField("id", value.getId());
        gen.writeStringField("name", value.getName());
        gen.writeEndObject();
    }
    
}
(1)プログレッシブクラスdtoは、汎型クラスserializerを継承し、プログレッシブなPOJOクラスJsonViewTypeDTOがタイプ変数として機能することが期待される。(2)JsonViewTypeSerializerをカバーする方法は、JsonSerializerへの順序付けを実現する。JsonViewTypeDTO:オブジェクトの例は、順序付けされるオブジェクトの現在の属性値のすべてを含む。serialize():順序化された結果セットは、JsonViewTypeDTO法により、順序付けされたJSONデータを組み立てます。value:jsonオブジェクトを構築するためのもので、jsonデータのgenに相当する。上記の例では、順序化されたgen.write***データは、writeStartObject() …… writeEndObject(){}の2つの属性を含み、自分の業務の必要に応じて属性セットを構築することができる。
第二のステップは、オブジェクト属性にjsonの注釈を使用し、using値にidを採用する。
……
    /**      */
    @JsonView({ListView.class})
    @JsonSerialize(using = JsonViewTypeSerializer.class)
    private JsonViewTypeDTO type;
……
2、List<JsonView AttributeDT>タイプの属性序列化方案
第一ステップは、nameパッケージの下で@JsonSerializeのプログレッシブクラスを作成します。
public class JsonViewAttributeListSerializer extends JsonSerializer<List<JsonViewAttributeDTO>> {
    
    @Override
    public void serialize(List<JsonViewAttributeDTO> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (null != value && value.size() > 0) {
            gen.writeStartArray();
	        for (JsonViewAttributeDTO attributeDTO : value) {
	            gen.writeStartObject();
	            gen.writeNumberField("id", attributeDTO.getId());
	            gen.writeStringField("name", attributeDTO.getName());
	            gen.writeEndObject();
	        }
	        gen.writeEndArray();
	    }
	}

}
上記の例示的なコードから、JsonViewTypeSerializer.classの型変数は、私たちがプログレッシブする対象タイプserializerであり、Listの方法では、JsonSerializerの値が空であるかどうかを先に判断し、非空の状態で属性オブジェクトをループ処理する。Listserialize()はjsonデータのListに相当し、 はjsonデータのwriteStartArray() / writeEndArray()に相当する。
第二のステップは、オブジェクト属性に[]の注釈を使用し、using値にwriteStartObject() / writeEndObject()を採用する。
……
    /**        */
    @JsonView({ListView.class})
    @JsonSerialize(using = JsonViewAttributeListSerializer.class)
    private List<JsonViewAttributeDTO> attribute;
……
四.著者のオススメ{}の使用において、著者らは、1、@JsonSerializeの管理を容易にするために、すべてのJsonViewAttributeListSerializer.classは、@Json Viewフィルタリング属性を必要とする@JsonViewクラス(entityまたはdto)の を採用して実施することを提案している。2、 は継承をサポートし、すべてのフィールドが関係を含むPOJOは継承方式を採用することを提案する。3、 は、複数の必要かつ相続関係を含まない を同じ@Json View注釈に置くことができる配列をサポートする。4、強く提案しています。すべてのControllerインターフェースで、結果の対象は でフィルタリングしなければなりません。5、@JsonView({A.class, B.class})類の順列化処理類は、当該クラスの所在するカバンの の下に保管して、後期のメンテナンスに便利であることを提案しています。
  |- controller 
  |- entity             //        
     |- serializer      //      (             )
  |- dto                //         
     |- serializer      //      (             )
  |- service