我做了一个返回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 上发出 GET 请求时http://localhost:8181/settings?ids=123&fields=customData,user_id我得到以下信息:
[
{
"id": 0,
"user_id": 123,
"customData": "testCustomDataFor123",
"deactivationDate": null
}
]
虽然我想要的是:
[
{
"user_id": 123,
"customData": "testCustomDataFor123"
}
]
把@JsonIgnore
放在你不需要的字段或其获取器上。
如果可以决定在编译时过滤的属性,则使用注释@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
.
可以在此处找到更多解释。