【问题标题】:Passing the URI Path to the JAX-RS Providers将 URI 路径传递给 JAX-RS 提供程序
【发布时间】:2010-07-13 20:32:32
【问题描述】:

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

因此,有必要将版本传递给自定义 JIBX 提供程序,因此还有包含该版本的 URL 路径。但是,Provider 接口(@98​​7654321@ 和 MessageBodyReader)没有在其接口方法中提供 URI 路径。

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

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

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

【问题讨论】:

  • 如果我错了,请纠正我,但 Jersey 实现的是 JAX-RS,而不是 JAX-WS
  • 哦,是的,你是对的。更新到 JAX-RS

标签: java jersey jax-rs


【解决方案1】:

如果你想要比 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 实现都应该能够做到这一点。

【讨论】:

    【解决方案2】:

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

    例如,

    public class CustomProvider implements MessageBodyWriter
    {
    
        @Context HttpServletRequest request;
    
        ....
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2015-12-09
      • 2018-06-18
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多