使用 JAX-RS,而不特定于实现



我有一个服务,我想在几个项目中以基本相同的方式使用。我想简化向这些项目发送和接收数据的过程,所以我想创建一个客户端jar来处理打包和解包jaxrs响应/请求的过程,并将其包含在我的其他项目中。

但是,要使用任何jax-rs对象,我必须依赖于jax-rs的特定实现。在我的小客户端库中,我必须包含 jersey(或 resteasy 或 cxf)才能访问任何 jax-rs 导入。如果我在我的任何其他项目中包含这个 jar,他们也将被迫使用该 rest 实现。

有没有办法创建一个利用jax-rs对象的单个项目jar,它将使用消费容器的jax-rs实现,而不是拥有许多几乎相同的客户端项目,只包含不同的jax-rs实现?

从本质上讲,我希望我的项目战争包含一个罐子,该罐子将处理打包和解包jax-rs休息对象,这些对象使用战争项目使用的任何jax-rs实现。

javax.ws.rs.*软件包中的类是可移植的,并且应该在不同的 JAX-RS 实现中工作。使用以下依赖项:

<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1</version>
</dependency>

以下包中的类是特定于实现的,当您希望代码在不同实现之间可移植时,您不希望直接使用它们:

  • 泽西岛:org.glassfish.jersey.*

  • 休息:org.jboss.resteasy.*

  • Apache CXF:org.apache.cxf.jaxrs.*

但是,此类类在运行时必须位于类路径中


JAX-RS 客户机 API 在 JAX-RS 2.0 中引入,并在 JAX-RS 2.1 中通过响应式功能进行了增强。有关详细信息,请查看 API 文档。

在 JAX-RS 2.0 之前,任何客户机支持都是特定于供应商的,而不是可移植的。大多数供应商提供的基于代理的客户端也不是可移植的。

JAX-RS 客户机 API 可以按如下方式使用:

Client client = ClientBuilder.newClient();
Response response = client.target("http://example.org/hello").request("text/plain").get();

在上面的代码中,将使用 JAX-RS 实现提供程序提供的缺省javax.ws.rs.client.ClientBuilder实现类创建一个javax.ws.rs.client.Client实例。


如果您有兴趣,请查看Client实现的文档:

  • 泽西岛:org.glassfish.jersey.client.JerseyClient

  • 休息:org.jboss.resteasy.client.jaxrs.ResteasyClient

  • Apache CXF:org.apache.cxf.jaxrs.client.spec.ClientImpl

最新更新