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

时间:2019-01-09 13:26:46

标签: java rest jax-rs specifications

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

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

我在应用程序中看到的类为什么是JAX-RS类,例如javax.ws.rs.core.Response类。 上课不应该是球衣课吗? 还是可以直接使用“规范类”?

我认为我会看到的所有类都是Jersey API中的类,但事实并非如此。 有人可以解释何时使用规范和实现中的类吗?

3 个答案:

答案 0 :(得分:1)

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

这是一个抽象类,因此无法实例化。

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

例如:

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

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

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

答案 1 :(得分:0)

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

此API主要包括接口(因此没有实现)和注释,API的用户可以使用它们来装饰其类,并且预期实现将相应地处理和处理。

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

在您的情况下,Response是抽象类。在这种特定情况下,真正的原因可能仅仅是因为在Java 8之前不允许您在接口中使用static方法。如您所见,它有许多static实用程序方法。它还提供了一个具体的实例方法getHeaders(),设计人员认为该实例方法应该始终是相同的(再次在Java 8之后,它可能是一个default接口方法)。

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

答案 2 :(得分:0)

该规范的主要思想是允许使用可以在任何兼容的实现上运行的“标准” API开发应用程序,这一点是JAX-RS应用程序应在最小的更改下工作使用Jersey,Reasteasy或其他实现;这使它们易于携带。

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