3

我最近实现了 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 类型。有没有解决的办法?

4

2 回答 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 实现都应该能够做到这一点。

于 2010-07-22T22:39:11.943 回答
1

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

例如,

public class CustomProvider implements MessageBodyWriter
{

    @Context HttpServletRequest request;

    ....
}

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

于 2010-07-13T21:26:54.377 回答