我正在实现一个MessageBodyReader
需要在处理过程中根据请求 URI 解析 URI 的自定义。如果MessageBodyReader
在 JAX-RS服务器实现中使用,例如。UriInfo
处理传入的 POST 请求,我可以从运行时注入的对象获取请求 URI @Context
(如在https://stackoverflow.com/a/3314076中所述):
public class MyProvider implements MessageBodyReader {
@javax.ws.rs.core.Context
javax.ws.rs.core.UriInfo uriInfo;
@Override
public Iterable<URI> readFrom(Class<Iterable<URI>> clazz, Type genericType,
Annotation annotations[], MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
URI requestURI = uriinfo.getAbsolutePath(); // NPE if called in a client
// Parsing entityStream resolving relative URIs using requestURI
}
}
如果在读取 ' 的实体期间在MessageBodyReader
JAX-RS客户端Response
实现中调用,则不会发生注入,因此NullPointerException
当我使用 JAX-RS 编写客户端时,我会得到一个(参见上面的行),例如:
Iterable<URI> it = ClientBuilder.newClient().target("http://example.org/").request().get()
.readEntity(new GenericType<Iterable<URI>>(){});
为了解决 URI,我的问题是:
在 JAX-RS客户端实现中调用readFrom(...)
的情况下,如何找出请求 URI ?MessageBodyReader
我当前的解决方法:阅读Jersey 文档的第 10.4 章“过滤器和拦截器执行顺序”后,我发现在第 16 步中ClientResponseFilter
,我可以访问请求 URI 和响应标头。因此,我编写了一个ClientResponseFilter
将请求 URI 放入自定义响应标头中的方法。然后,我可以从readFrom(...)
.