2

我正在实现一个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

  }
}

如果在读取 ' 的实体期间在MessageBodyReaderJAX-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(...).

4

0 回答 0