泽西岛1.x与Jackson:自定义响应JSON

时间:2015-04-17 13:31:16

标签: java json rest jersey jackson

我使用Jersey 1.19来实现rest api和Jackson以提供JSON支持。我的资源实体是深层嵌套的,我想在发送之前将它们展平。我还想基于查询参数提供过滤支持。示例GET /users/1234返回整个用户资源,而GET /users/1234?filter=username,email将返回仅包含给定字段的用户资源。

我目前采用的方法是JsonSerializer的子类,它使层次结构变得扁平,但不能处理基于参数的过滤,因为它独立于请求/响应周期。谷歌搜索向我指出MessageBodyWriter。看起来像我需要的,但处理序列化的writeTo method不会使任何参数可以让我访问请求,因此查询参数。所以我很困惑如何在这种方法中访问这些参数。

欢迎任何想法

2 个答案:

答案 0 :(得分:1)

  

所以我很困惑如何在这种方法中访问这些参数。

您可以将UriInfo @Context注入MessageBodyWriter。然后拨打uriInfo.getQueryParameter()以获取参数。例如

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class YourWriter implements MessageBodyWriter<Something> {

    @Context UriInfo uriInfo;

    ...
    @Override
    public void writeTo(Something t, Class<?> type, Type type1, Annotation[] antns, 
            MediaType mt, MultivaluedMap<String, Object> mm, OutputStream out) 
            throws IOException, WebApplicationException {

        String filter = uriInfo.getQueryParameters().getFirst("filter");
    } 
}

另一种选择是使用ContextResolver并使用预配置的ObjectMapper用于不同的方案。您还可以将UriInfo注入ContextResolverFor example

答案 1 :(得分:0)

您应该能够传入一个列表和/或如果您想要去那条路线,您可以公开Request对象。

尝试......

@Context
UriInfo uriInfo;
@Context
HttpServletRequest request;

或尝试将您的Rest方法改为类似......

@GET
@Path("/myMethodLocator")
@Consumes(MediaType.APPLICATION_JSON)
...
public <whatever type you are returning> myMethod(List<String> filterByList) ...
...