我使用Jersey 1.19来实现rest api和Jackson以提供JSON支持。我的资源实体是深层嵌套的,我想在发送之前将它们展平。我还想基于查询参数提供过滤支持。示例GET /users/1234
返回整个用户资源,而GET /users/1234?filter=username,email
将返回仅包含给定字段的用户资源。
我目前采用的方法是JsonSerializer
的子类,它使层次结构变得扁平,但不能处理基于参数的过滤,因为它独立于请求/响应周期。谷歌搜索向我指出MessageBodyWriter
。看起来像我需要的,但处理序列化的writeTo method不会使任何参数可以让我访问请求,因此查询参数。所以我很困惑如何在这种方法中访问这些参数。
欢迎任何想法
答案 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
注入ContextResolver
。 For 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) ...
...