[英]How to return only some fields in the response
我做了一個返回 UserSettings 對象數組的服務:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/")
public Response getBulkSettings(@QueryParam("fields") List<String> fields, @QueryParam("ids") List<String> ids) {
List<UserSettings> responseArr = mailerService.fetchSettings(ids,fields);
return Response.ok(responseArr).build();
}
當我對 URL http://localhost:8181/settings?ids=123&fields=customData,user_id發出 GET 請求時,我得到以下信息:
[
{
"id": 0,
"user_id": 123,
"customData": "testCustomDataFor123",
"deactivationDate": null
}
]
雖然我想要的是:
[
{
"user_id": 123,
"customData": "testCustomDataFor123"
}
]
將@JsonIgnore
放在您不想要的字段或其 getter 中。
如果您可以決定要在編譯時過濾的屬性,則使用注釋@JsonIgnore
是一種解決方案。 在您的示例中,您希望在運行時進行過濾,這可以使用 JSON 庫中的技術來實現。 例如,在使用 Genson 時,您可以執行以下操作:
new GensonBuilder().exclude("password").create();
但是,通過這樣做,您失去了不必關心您的響應如何序列化為 JSON 的優勢。 因此,我建議您考慮一下是否真的有必要讓客戶端動態決定要返回的屬性。 另一種解決方案可能是使用application/json
以外的媒體類型,這將允許客戶端請求資源的不同視圖。 Jersey 使用Accept
標頭中給定的媒體類型將傳入請求分發給服務類中的方法。 在每種方法中,您都可以使用UserSettings
類的不同子類,這些子類使用注釋@JsonIgnore
排除不同的屬性。
你可以按照其他回應的建議去做。 JAX-RS 的另一個選擇是利用另一個 Genson 功能,該功能使您能夠過濾應包含或排除的屬性。 為此,使用此特殊過濾器注冊自定義 Genson 實例。
UrlQueryParamFilter filter = new UrlQueryParamFilter();
Genson genson = new GensonBuilder().useRuntimePropertyFilter(filter).create();
new ResourceConfig()
.register(new GensonJaxRSFeature().use(genson))
.register(filter);
然后在查詢中定義要包含或排除的屬性: http://localhost/foo/bar?filter=age&filter=name
。
可以在此處找到更多解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.