我最近实施了Jersey JAX-RS Rest服务。我创建了一个JIBX提供程序,允许用户在XML和Java类型之间解组和编组。我还想通过在URL路径中指定版本来对我的服务进行版本控制。版本控制将包括用于编组和解组Java类型的消息绑定版本。
因此,必须将版本传递给自定义JIBX提供程序,因此必须传递包含该版本的URL路径。但是,Provider接口(MessageBodyWriter
和MessageBodyReader
)不在其接口方法中提供URI路径。
以下是writeTo()
接口的MessageBodyWriter
方法的方法签名:
writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream)
此方法参数不包含路径uri,因此,自定义jibx提供程序无法知道应该使用哪种消息绑定版本来编组Java类型。有没有解决的办法?
答案 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;
....
}
将自动为每个请求设置此字段。即使将请求设置为字段,该值也是线程安全的,因为实际请求使用代理,并且很可能是本地线程来确定属于线程的请求。