使用在规范 (JAX-RS) 中定义或在实现 (Jersey) 中定义的 类?

Use classes defined in a specification (JAX-RS) or defined in an implementation (Jersey)?

我是 java 中使用 REST 的新手。 在检查在 java 中实现 REST 服务的应用程序时,我看到 classes 是在 javax.ws.rs 包中定义的。

据我了解,JAX-RS 是一个规范,为了使用它,您需要一个实现,例如 Jersey。

为什么我在应用程序中看到的 classes 是 JAX-RS classes,例如 javax.ws.rs.core.Response class。 classes 不应该是 Jersey-classes 吗? 或者可以直接使用"specification-classes"吗?

我以为我会看到的所有 classes 都是来自球衣 API 的 classes,但事实并非如此。 有人可以解释一下何时使用规范与实现中的 classes 吗?

该规范确实只是定义了 API 任何 JAX-RS 实现(例如 Jersey)都应该实现的。

这个 API 主要包括接口(因此没有实现)和注释,API 的用户可以用它们来装饰他们的 类,并且实现预计会处理和相应处理。

正如您正确注意到的那样,API 还定义了一些抽象或具体的 类。这主要用于 API 定义接口方法所期望的一些数据结构的地方。也可能是规范强制执行了一些最小的 API 级逻辑。他们被故意隔离到这个 javax.ws.rs.core 包中。

在你的情况下 Response is an abstract class. In this specific case, the real reason could be simply because before Java 8 you weren't allowed to have a static method in an interface. And as you can see, it has a lot of static utility methods. It also provides a concrete instance method getHeaders() 设计者认为它可能总是相同的(在 Java 8 之后这可能是一个 default 接口方法)。

有一个 few other classes 可能出于类似的原因而存在,作为对 API 的支持 类。

javax.ws.rs.core.Response 是 JAX-RS API 的一部分,即 规范 .

它是一个抽象 class,因此无法实例化。

球衣com.sun.jersey.core.spi.factory.ResponseImpl中实施Response。实际名称并不重要,因为您应该使用 ResponseBuilder JAX-RS API.

实例化 Response

例如:

Response res = Response.ok().build();

这将在内部查找一个实现并将其实例化。

(如果您只包含 JAX-RS API,该调用将在 运行 时失败)

规范背后的主要思想是允许使用可以在任何兼容实现上工作的 "standard" API 开发应用程序,关键是 JAX-RS 应用程序应该无论您使用的是 Jersey、Reasteasy 还是其他实现,都可以进行最少的更改;这使它们便于携带。

这并不特定于 JAX-RS:对于 JAX-WSJava EEJDBC 和许多其他规范也可以这样说。可以使用特定于实现的 类(某些实现甚至为此提供文档),但可移植的 JAX-RS 代码使用标准 API.