8、@JsonViewフィルタ応答本文のオブジェクト属性
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ページのレンダリング作業に注目する必要はなく、業務データのフィードバックと状態情報フィードバックに専念して、フロントエンドの学生によってページレンダリングを完成させる必要があります。したがって、日常的な開発において、私たちは
日常的に開発された作業では、通常は異なるビジネスシーンに遭遇し、同じ結果の対象が返すフィールド情報が異なる。例えば、ユーザ情報インターフェースに対して、管理端末が使用する場合、管理者が確認、修正するために、ユーザの携帯番号、身分証番号などの敏感な情報を返す必要がある。ユーザーが使う場合は、名前や顔写真などの非敏感な情報だけが必要です。2、管理リストに表示されるフィールド情報とデータ編集画面に表示されるデータも異なる。
Spring MVCは私達のために@JsonView注釈を提供して、結果の対象に対する再現フィールドのフィルタリング機能を実現して、本文は@Json Viewの使用と推奨の使い方を詳しく説明します。
一.依存追加
私たちの
二.@JsonViewプロパティフィルタリング
具体的な実現案は以下の通りである。
第1のステップは、結果セットとしてオブジェクトに戻る
二番目のステップは、業務の需要に応じて、@JsonViewを通じて関連する属性を注釈します。
第三段階、Controllerインターフェースの注釈を完成します。
ステップ4で、アイテムを起動し、それぞれリストと詳細インターフェースを呼び出して、応答体の属性フィルタ効果を確認します。呼び出し:
三.@JsonViewオブジェクトタイプの属性フィールド処理
注意深い読者は、上記の2つのスクリーンショットでは、
ここで著者らは、
1、Json View TypeDTMタイプの属性序列化方案
第1のステップは、
第二のステップは、オブジェクト属性に
第一ステップは、
第二のステップは、オブジェクト属性に
説明
前後で分離されたプロジェクトの中で、サービス端末インターフェースはWEBページのレンダリング作業に注目する必要はなく、業務データのフィードバックと状態情報フィードバックに専念して、フロントエンドの学生によってページレンダリングを完成させる必要があります。したがって、日常的な開発において、私たちは
HTTP
を通じて応答状態をマークし、本文に応答してインタフェースを通して情報をフィードバックする。より良いフォーマット応答情報のために、現在の主流の方式はJSON
フォーマットで戻る。spring mvcは、要求ヘッダの@ResponseBody
パラメータ値に応じて、対応する応答変換器Accept
を呼び出して、要求結果オブジェクトを対応するフォーマットで応答体に書き込むことができます。日常的に開発された作業では、通常は異なるビジネスシーンに遭遇し、同じ結果の対象が返すフィールド情報が異なる。例えば、ユーザ情報インターフェースに対して、管理端末が使用する場合、管理者が確認、修正するために、ユーザの携帯番号、身分証番号などの敏感な情報を返す必要がある。ユーザーが使う場合は、名前や顔写真などの非敏感な情報だけが必要です。2、管理リストに表示されるフィールド情報とデータ編集画面に表示されるデータも異なる。
Spring MVCは私達のために@JsonView注釈を提供して、結果の対象に対する再現フィールドのフィルタリング機能を実現して、本文は@Json Viewの使用と推奨の使い方を詳しく説明します。
一.依存追加
私たちの
HttpMessageConverter
プロジェクトの構築において、依存関係のあるtysite-service
はすでにorg.springframework.boot:spring-boot-starter-web
の依存関係を含んでいます。追加する必要はありません。は、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で、アイテムを起動し、それぞれリストと詳細インターフェースを呼び出して、応答体の属性フィルタ効果を確認します。呼び出し:
インターフェース呼び出し:POJO
インターフェース以上、
クラスの識別された応答体は/api/example/json-view/list
クラスの識別された応答体よりも多く/api/example/json-view/detail
属性に戻りました。このスキームは、同じJsonViewInfoDTO.DetailView.class
クラスで応答オブジェクトとしている場合の属性フィルタリングを実現する。三.@JsonViewオブジェクトタイプの属性フィールド処理
注意深い読者は、上記の2つのスクリーンショットでは、
JsonViewInfoDTO.ListView.class
とpassword
のプロパティが正常にデータに戻りませんでしたが、空のオブジェクト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
の値が空であるかどうかを先に判断し、非空の状態で属性オブジェクトをループ処理する。List
:serialize()
は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