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

3
我最近实现了一个Jersey JAX-RS Rest服务。我创建了一个JIBX提供程序,允许在XML和Java类型之间进行解组和编组。我还想通过在URL路径中指定版本来对我的服务进行版本控制。版本控制将包括用于编组和解组Java类型的消息绑定的版本。
因此,有必要将版本传递给自定义JIBX提供程序,并因此包含版本的URL路径。然而,Provider接口(MessageBodyWriter和MessageBodyReader)在其接口方法中不提供URI路径。
以下是MessageBodyWriter接口的writeTo()方法的方法签名:
writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream)

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


请纠正我如果我错了,但是Jersey实现的是JAX-RS而不是JAX-WS。 - skaffman
哦,是的,你说得对。更新为JAX-RS。 - onejigtwojig
2个回答

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来捕获路径参数。您可以潜在地使用UriInfo.getPathParameters()。您也可以回退到UriInfo.getPathSegments()以获取所需信息。这样可以避免自己解析请求URI的麻烦。任何JAX-RS实现都应该能够做到这一点。


1

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

例如,

public class CustomProvider implements MessageBodyWriter
{

    @Context HttpServletRequest request;

    ....
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接