当前位置: 首页 > 知识库问答 >
问题:

JAX-RS/Jersey:客户端代理:如何从上下文中注入路径参数而不是方法参数?

卞俊贤
2023-03-14
@Path("foo/{instance}")
public interface Foo 
{
    @Context private UriInfo uriInfo;

    @POST
    @Path("doit")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Thing1 doit(Thing2 arg);
}

但当然不能这样做,它是一个接口,而不是一个类。但是接口是使用代理模式所需要的。我使用代理模式创建客户机:

ClientBuilder builder = ClientBuilder.newBuilder().register(JacksonJsonProvider.class);
MyRequestFilter filter = new MyRequestFilter();
builder = builder.register(filter);
WebTarget target = builder.build().target(url);
Foo serviceClient = WebResourceFactory.newResource(Foo.class, target);

但是,调用ServiceClient.doit(...)会导致IllegalStateException:模板变量'instance‘没有值。我尝试使用ClientRequestFilter来注入实例变量,但在引发此异常之前甚至没有调用filter方法。是否有任何方法可以从客户机注入一个路径参数,而不将其作为@pathparam参数添加到每个方法中?原因是,我已经定义了一个接口,我希望我的代理客户端实现这个接口,添加一个参数会改变签名。

共有1个答案

景品
2023-03-14

在JAX-WS客户机的foo接口中,为缺少的模板值添加@pathparam

@Path("foo/{instance}")
public interface Foo 
{
    @POST
    @Path("doit")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Thing1 doit(@PathParam("instance") String instance, Thing2 arg);
}

显然,您还需要更改客户机调用doit()的方式,以适应这一点。

Thing1 thing1 = serviceClient.doit("anything", arg);

您的服务器资源(客户端接口所基于的)不需要更改。

 类似资料:
  • 我试图在was 8.5上部署使用jersey的jax-rs客户机应用程序。 我希望我不需要在war中打包jersey JAR,因为was将提供它们。 但在试图调用servlet时,我遇到了这个错误: 我可以做些什么来使用was库,这样我就不需要把它们打包在我的应用程序中了吗?

  • 我需要将带有多个可选参数的路径映射到我的endpoint

  • 运行一个客户端最少需要Jersey框架的哪些JAR文件?如果我包括所有的JAR,它将占用4 MB。

  • 我正在使用泽西JAX-RS客户端(版本2.0)。我知道它使用Jackson ObjectMapper来生成和解析JSON。我想使用相同的对象为一些java类生成JSON,这样我就可以将它们写入日志。 我知道我可以创建一个新的ObjectMapper实例,但我更喜欢请求泽西客户端给我一个它正在使用的引用。我该怎么做呢?泽西2.0知道Jackson,因为它包含一个JacksonFeature类,该类首

  • 我有一个方法 我可能更容易获得查询参数的映射。

  • 我有一个 JAX-RS 客户端,它正在发出一个简单的 GET 请求。我正在使用CXF实现和Spring for DI。调用成功,我得到的响应代码为 200。但是我在将响应读入我的POJO时遇到错误。 例外: 代码: 在我的类路径中,我有下面这个答案中所建议的依赖项,它似乎不会自动获取。 我还尝试在创建客户端时注册json提供程序: 和 但这些选择都不起作用。当我使用上面的一个选项注册json提供程