JAX-RS 中的 Provider 是什么意思?

有人能给我解释一下什么是 JAX-RS 提供程序以及‘@Provider’注释是做什么的吗?我一直在阅读文件,但我不能得到它。
如果有为传入请求提供服务的资源类,提供程序应该做什么?当我创建一个持久资源类(不是每个请求一个)时,它们与单例资源类有什么不同?或者这些类也是提供程序?

95601 次浏览

提供程序只是扩展和定制 JAX-RS 运行时的一种方法。您可以将它们看作是(潜在地)改变运行时行为的插件,以便实现一组(程序定义的)目标。

提供程序与资源类相同,它们在概念上存在于资源类和 JAX-RS 实现之间的一个级别。如果有帮助的话,您可以将它们看作是设备驱动程序(存在于用户和内核空间之间)。这是一个广泛的概括。

当前 JAX-RS 规范定义了三类提供程序。它们之间的共同点是,所有提供程序都必须通过@Provider 注释标识,并遵循构造函数声明的某些规则。除此之外,不同的提供程序类型可能有附加的注释,并将实现不同的接口。


实体提供者

这些提供者控制数据表示(如 XML、 JSON、 CSV)到其 Java 对象等价物的映射。

上下文提供者

这些提供程序控制资源可以通过@Context 注释访问的上下文。

异常提供程序

这些提供程序控制 Java 异常到 JAX-RSResponse 实例的映射。


您的运行时将带有许多预定义的提供程序,它们将负责实现基本功能级别(例如,与 XML 的映射和来自 XML 的映射、转换最常见的异常等等)。还可以根据需要创建自己的提供程序。

JAX-RS 规范对于阅读这些不同的提供商类型以及它们的作用是一个很好的参考(参见第4章)。

@ 提供者注释用于 JAX-RS 运行时感兴趣的任何内容,例如 MessageBodyReaderMessageBodyWriter。对于 HTTP 请求,MessageBodyReader 用于将 HTTP 请求实体正文映射到方法参数。在响应端,使用 MessageBodyWriter 将返回值映射到 HTTP 响应实体正文。如果应用程序需要提供额外的元数据,比如 HTTP 头或不同的状态代码,那么方法可以返回一个包装实体的 Response,该 Response 可以使用 Response.ResponseBuilder 响应生成器构建。

@ Provider 注释使您能够在原始 XML 级别检查传入和传出消息,通过这种方式,Provider 与客户机上的 Dispatch 相对应。

为了执行某些活动,例如 Filtering-Request/Response、 Exception Processing,JAX-RS 有自己的默认实现逻辑。 但是,它也允许用户提供他们自己的实现。

为了提供我们自己的实现,我们需要通过使用@Provider 注释指定适当的类来实现它们。

JAX-RS 将进行一轮扫描,通过搜索@Provider 注释来找到任何这样的用户定义实现的存在。

例如:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...


...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...