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

我目前采用的方法是JsonSerializer的子类,该子类简化了层次结构,但是由于它独立于请求/响应周期,因此无法处理基于参数的筛选。 Google搜索将我指向MessageBodyWriter。看起来像我需要的东西,但是处理序列化的writeTo 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中。 For example

09-27 12:47