相关疑难解决方法(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抛出"JsonMappingException:无法解析BeanPropertyFilter"

是否有可能选择性地确定@JsonFilter注释何时在运行时使用?

当我不提供过滤器时,我收到JsonMappingException异常(见下文).

背景:

我从最近的StackOverflow帖子中了解到,我可以使用@JsonFilter来动态过滤被序列化的bean属性.这非常有效.添加@JsonFilter("apiFilter")到我的域类并在我的jax-rs服务中添加此代码(使用CXF实现)后,我能够动态过滤我的RESTful API返回的属性:

// shortened for brevity
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

return mapper.filteredWriter(filters).writeValueAsString(user);
Run Code Online (Sandbox Code Playgroud)

问题是有不同的服务调用,我根本不想应用过滤器.在这些情况下,我想返回整个域类而不过滤任何属性.在我只是尝试返回域类的情况下,我得到一个例外,如下所示:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured

at org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)
at org.codehaus.jackson.map.ser.BeanSerializer.serializeFieldsFiltered(BeanSerializer.java:216)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:140)
Run Code Online (Sandbox Code Playgroud)

json cxf jax-rs jackson

15
推荐指数
3
解决办法
1万
查看次数

标签 统计

cxf ×2

jax-rs ×2

json ×2

jackson ×1

java ×1