将URI路径传递给JAX-RS提供程序

时间:2010-07-13 20:32:33

标签: java jersey jax-rs

我最近实施了Jersey JAX-RS Rest服务。我创建了一个JIBX提供程序,允许用户在XML和Java类型之间解组和编组。我还想通过在URL路径中指定版本来对我的服务进行版本控制。版本控制将包括用于编组和解组Java类型的消息绑定版本。

因此,必须将版本传递给自定义JIBX提供程序,因此必须传递包含该版本的URL路径。但是,Provider接口(MessageBodyWriterMessageBodyReader)不在其接口方法中提供URI路径。

以下是writeTo()接口的MessageBodyWriter方法的方法签名:

writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream)

此方法参数不包含路径uri,因此,自定义jibx提供程序无法知道应该使用哪种消息绑定版本来编组Java类型。有没有解决的办法?

2 个答案:

答案 0 :(得分:9)

如果你想要比HttpServletRequest更多的JAX-RS,你可以注入一个javax.ws.rs.core.UriInfo。

public class MyProvider implements MessageBodyWriter {
    @javax.ws.rs.core.Context
    javax.ws.rs.core.UriInfo uriInfo;
}

我假设你使用@javax.ws.rs.PathParam来捕获path参数。然后,您可以使用UriInfo.getPathParameters()。您还可以回退到UriInfo.getPathSegments()以获取您正在寻找的信息。这样可以省去自己解析请求URI的麻烦。任何JAX-RS实现都应该能够做到这一点。

答案 1 :(得分:0)

您可以通过在提供商的字段上定义@Context注释来访问提供商的URI路径。

例如,

public class CustomProvider implements MessageBodyWriter
{

    @Context HttpServletRequest request;

    ....
}

将自动为每个请求设置此字段。即使将请求设置为字段,该值也是线程安全的,因为实际请求使用代理,并且很可能是本地线程来确定属于线程的请求。