我正在构建RESTful API,并希望为开发人员提供选择在JSON响应中返回哪些字段的选项. 此博客文章显示了几个API(Google,Facebook,LinkedIn)如何允许开发人员自定义响应的示例.这被称为部分响应.
示例可能如下所示:
/users/123?fields=userId,fullname,title
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,API应返回User"123"的userId,fullName和title字段.
我正在寻找如何在我的RESTful Web服务中实现它的想法.我目前正在使用CXF(编辑:和杰克逊),但愿意尝试另一种JAX-RS实现.
这就是我现在拥有的.它返回一个完整的User对象.如何根据"字段"参数返回API调用者在运行时想要的字段?我不想让其他字段为空.我根本不想归还他们.
@GET
@Path("/{userId}")
@Produces("application/json")
public User getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
// here's where i would like to select only the fields i want to return
}
return user;
}
Run Code Online (Sandbox Code Playgroud)
更新:
我按照unludo的链接然后链接到这个:http://wiki.fasterxml.com/JacksonFeatureJsonFilter
有了这些信息,我就加入@JsonFilter("myFilter")
了我的域类.然后我修改了我的RESTful服务方法以返回String而不是User,如下所示:
@GET
@Path("/{userId}")
@Produces("application/json")
public String getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer …
Run Code Online (Sandbox Code Playgroud) 我可以指定ObjectMapper
Spring RestTemplate
使用的Jackson 吗?
我不是100%这就是我需要做的,但请参阅下面的详细信息。
背景: 在此StackOverflow帖子的帮助下,我在域类中添加了@JsonFilter并编辑了我的jax-rs Web服务(在CXF中实现)。现在,我可以成功地动态选择要在我的RESTful API中返回的域类字段。到目前为止,一切都很好。
我在JUnit测试中使用Spring的RestTemplate来测试RESTful API。在我将@JasonFilter添加到我的域类之前,它一直运行良好。现在,我得到以下异常:
org.springframework.web.client.ResourceAccessException:I / O错误:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider;嵌套的异常是org.codehaus.jackson.map.JsonMappingException:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider
在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
为简洁起见,其余的堆栈跟踪被省略
引起原因:org.codehaus.jackson.map.JsonMappingException:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider
在org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)
我在服务器端遇到了类似的问题,并且可以通过给Jackson 如下所示来解决此问题(在此职位的帮助下):FilterProvider
ObjectMapper
ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
Run Code Online (Sandbox Code Playgroud)
我可以在RestTemplate端做类似的事情吗?任何有关如何解决此问题的想法都将受到赞赏。
为了清楚起见,在客户端RestTemplate端,我根本不想过滤域对象属性。