如何仅返回响应中的某些字段

时间:2018-01-03 17:51:37

标签: java web-services jersey

我创建了一个返回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"
}
]

3 个答案:

答案 0 :(得分:2)

在您不想要的字段或其获取的字段中使用@JsonIgnore

答案 1 :(得分:1)

如果您可以在编译时决定要过滤的属性,则使用注释@JsonIgnore是一种解决方案。在您的示例中,您希望在运行时进行过滤,这可以使用JSON库中的技术来实现。例如,当使用Genson时,您可以执行以下操作:

new GensonBuilder().exclude("password").create();

然而,通过这样做,您将失去不必关心如何将响应序列化为JSON的优势。因此,我想建议你认为客户是否真的有必要动态决定要返回的属性。另一种解决方案可能是使用除application/json之外的媒体类型,以允许客户端请求资源的不同视图。 Jersey使用Accept标头中给出的媒体类型将传入请求分发到服务类中的方法。然后,您可以在每个方法中使用注释UserSettings排除不同属性的@JsonIgnore类的不同子类。

答案 2 :(得分:0)

你可以做其他回答所暗示的方式。 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

可以找到更多解释here