Jersey 1.x with Jackson : 自定义响应 JSON

Jersey 1.x with Jackson : Customising the response JSON

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

我目前采用的方法是 JsonSerializer 的子类,它使层次结构扁平化,但无法处理基于参数的过滤,因为它独立于 request/response 循环。 Google 搜索指向 MessageBodyWriter。看起来像我需要的,但是处理序列化的 writeTo method 不采用任何可以让我访问请求的参数,因此也没有访问查询参数。所以我很困惑如何在这个方法中访问这些参数。

欢迎提出任何想法

您应该能够在 and/or 中传递一个列表,如果您想走那条路线,您可以公开 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) ...
...

So I am confused how to access those params in this method.

您可以将 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 注入 ContextResolver