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

Java 是否使用规范(JAX-RS)中定义的类或实现(Jersey)中定义的类?,java,rest,jax-rs,specifications,Java,Rest,Jax Rs,Specifications,我是java中REST的新手。 在检查用java实现REST服务的应用程序时,我看到了javax.ws.rs包中定义的类 据我所知,JAX-RS是一个规范,为了使用它,您需要一个实现,例如Jersey 为什么我看到应用程序中使用的类是JAX-RS类,例如javax.ws.RS.core.Response类。 这些课程不应该像前面所说的那样是泽西课程吗? 或者可以直接使用“规范类”吗 我以为我看到的所有类都是来自Jersey API的类,但事实并非如此。 有人能解释一下何时使用规范与实现中的类吗?

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

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

为什么我看到应用程序中使用的类是JAX-RS类,例如
javax.ws.RS.core.Response
类。 这些课程不应该像前面所说的那样是泽西课程吗? 或者可以直接使用“规范类”吗

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

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

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

正如您正确注意到的,API还定义了一些抽象或具体的类。这主要用于API定义接口方法所期望的某些数据结构的地方。还有一种情况是,规范正在强制执行一些最小的API级逻辑。它们被特意分离到这个
javax.ws.rs.core
包中

在您的例子中,是一个抽象类。在这种情况下,真正的原因可能只是因为在Java8之前,不允许在接口中使用
静态方法。正如您所看到的,它有许多
静态
实用方法。它还提供了一个具体的实例方法,设计者认为该方法应该始终是相同的(同样在Java8之后,这可能是一个
默认的
接口方法)


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

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

它是一个抽象类,因此不能实例化

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

例如:

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

它将在内部查找实现并实例化它


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

该规范背后的主要思想是允许使用“标准”API开发应用程序,该API可以在任何兼容的实现上工作,这一点是无论您使用的是Jersey还是,Reasteasy或其他实现;这使它们便于携带


这并不特定于
JAX-RS
:对于
JAX-WS
javaee
JDBC
和许多其他规范也可以这样说。可以使用特定于实现的类(一些实现甚至提供了相关文档),但可移植JAX-RS代码使用标准API。

您所指的
响应
类实际上是抽象的。如果您查看代码中使用它的地方,那么必须有一些具体的实现。也许Jersey正在提供该实现。请参阅以获取更多详细信息,并附带示例谢谢。我现在在web.xml文件中看到,在
中指定了一个实现。我假设这就是“内部查找实现”的工作原理?这对我来说是一个谜,我从来没有在类本身中看到过提到的实现。查找发生在内部,它是一个简单的类路径搜索。只要实现在类路径上,它就会工作。