Apache CXF项目为REST服务提供了基于代理的客户端实现。这看起来像:
Resource resource = JAXRSClientFactory.create( baseAddress, Resource.class )
有人知道Jersey的类似实现吗?
我发现了一种使用@HyperMediaController
注释的方法,但我想坚持使用JSR-311默认注释,如@Path
和@Get
…
有人知道吗?
代理实现是存在的,但不幸的是,在版本2.22.1的Jersey Client API文档(Jersey User Guide中也没有)中甚至没有提到。
我找到的是WebResourceFactory的JavaDoc,更好的是JavaDoc包。下面是JavaDoc中关于WebResourceFactory使用的一个片段:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/");
MyResourceIfc resource = WebResourceFactory.newResource(MyResourceIfc.class, target);
在Maven中,你需要:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-proxy-client</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.1</version>
</dependency>
我发现WebResourceFactory不支持泛型类型,而且它的源代码真的很难理解。所以我们创建了https://github.com/adaptris/jaxrs-client-proxy,目前我们正在开发它。
要使用它,你需要构建一个资源:
ResourceBuilder builder = new ResourceBuilder();
resource = builder.
url("https://host/api").
build(Resource.class);
client = resource.get();
然后您可以调用client
-它是jax-rs注释描述的接口(Resource.class
)的代理。根据jax-rs客户端api的建议,您应该在停止使用资源后关闭它。
resource.close()
我创建了一个自己的实现。请参阅utils- api派生的wiki页面。