127

谁能向我解释一下 JAX-RS Provider 是什么以及“@Provider”注释的作用是什么?我一直在阅读文档,但我无法得到它。
如果有资源类为传入的请求提供服务,那么 Providers 会做什么?当我创建一个持久资源类(不是每个请求的资源类)时,它们与单例资源类有何不同?或者这些课程也是提供者?

4

3 回答 3

153

提供者是一种扩展和定制 JAX-RS 运行时的简单方法。您可以将它们视为(可能)改变运行时行为的插件,以实现一组(程序定义的)目标。

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

当前的 JAX-RS 规范定义了三类提供程序。它们之间的共同点是所有提供者都必须由@Provider 注解标识,并遵循一定的构造函数声明规则。除此之外,不同的提供者类型可能有额外的注解,并且会实现不同的接口。


实体提供者

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

上下文提供者

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

异常提供者

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


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

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

于 2012-11-26T01:41:47.100 回答
14

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

@Provider注解使您能够在原始 XML 级别检查传入和传出消息,这样 Provider 就相当于客户端上的 Dispatch。

于 2015-06-13T12:53:43.420 回答
9

为了执行某些活动,例如过滤请求/响应、异常处理,JAX-RS 有自己的默认实现逻辑。但是,它也允许用户提供他们自己的实现。

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

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

例如:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
于 2018-03-25T16:01:33.630 回答