簡體   English   中英

如何僅返回響應中的某些字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM