2010-07-13 68 views
3

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

因此,有必要的版本传递给定制JIBX提供商,因此包含版本的URL路径。但是,提供程序接口(MessageBodyWriterMessageBodyReader)不提供其接口方法中的URI路径。

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

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

此方法参数不包含路径URI,因此,自定义的JiBX提供商不能知道哪个消息结合版本它应该用于编组Java类型。有没有解决的办法?

+0

纠正我,如果我错了,但新泽西州实现了JAX-RS,而不是JAX-WS – skaffman 2010-07-13 21:32:54

+0

哦,是啊,你说得对。更新为JAX-RS – onejigtwojig 2010-07-14 14:32:18

回答

8

如果你想比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来捕获路径参数。然后,您可以使用UriInfo.getPathParameters()。您也可以回退到UriInfo.getPathSegments()以获取您要查找的信息。这为您节省了自己解析请求URI的麻烦。任何JAX-RS实现都应该能够做到这一点。

0

您可以在提供方上定义一个字段的@Context注释从提供商访问URI路径。

例如,

public class CustomProvider implements MessageBodyWriter 
{ 

    @Context HttpServletRequest request; 

    .... 
} 

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