在不特定于实现的情况下使用 JAX-RS

Use JAX-RS without being implementation specific

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

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

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

本质上,我希望我的项目 wars 包含一个 jar,它将处理 jax-rs 剩余对象的打包和解包,这些对象使用 war 项目使用的任何 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.*

  • RESTEasy:org.jboss.resteasy.*

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

但是这样的 classes 必须在运行时 class 路径中 .


JAX-RS 客户端 API 是在 JAX-RS 2.0 中引入的,并在 JAX-RS 2.1 中得到增强,具有反应能力。查看 API documentation 了解详情。

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

JAX-RS Client API 可以按如下方式使用:

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

在上面的代码中,一个 javax.ws.rs.client.Client instance will be created using the default javax.ws.rs.client.ClientBuilder 实现 class 由 JAX-RS 实现提供者提供。


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