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