相关疑难解决方法(0)

如何使用Java返回部分JSON响应?

我正在构建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)

java json cxf jax-rs

41
推荐指数
2
解决办法
3万
查看次数

使用@JsonFilter时,带有杰克逊的Spring RestTemplate抛出“无法解析BeanPropertyFilter”

我可以指定ObjectMapperSpring 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 如下所示来解决此问题(在此职位的帮助下):FilterProviderObjectMapper

ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
Run Code Online (Sandbox Code Playgroud)

我可以在RestTemplate端做类似的事情吗?任何有关如何解决此问题的想法都将受到赞赏。

为了清楚起见,在客户端RestTemplate端,我根本不想过滤域对象属性。

spring jackson

2
推荐指数
1
解决办法
5195
查看次数

标签 统计

cxf ×1

jackson ×1

java ×1

jax-rs ×1

json ×1

spring ×1