我正在使用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