我是使用Java中的REST的新手。
在检查用Java实现REST服务的应用程序时,我看到了javax.ws.rs
包中定义的类。
据我了解,JAX-RS是一个规范,要使用它,您需要一个实现,例如Jersey。
我在应用程序中看到的类为什么是JAX-RS类,例如javax.ws.rs.core.Response
类。
上课不应该是球衣课吗?
还是可以直接使用“规范类”?
我认为我会看到的所有类都是Jersey API中的类,但事实并非如此。 有人可以解释何时使用规范和实现中的类吗?
答案 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-WS
,Java EE
,JDBC
和许多其他规范也可以这样说。可能可以使用特定于实现的类(某些实现甚至为此提供了文档),但是可移植的JAX-RS代码使用标准API。