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

时间:2012-11-26 01:17:56

标签: java jersey jax-rs

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

3 个答案:

答案 0 :(得分:114)

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

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

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


实体提供商

这些提供程序控制数据表示(如XML,JSON,CSV)到其Java对象等效的映射。

上下文提供商

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

例外提供商

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


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

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

答案 1 :(得分:9)

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

@Provider 注释使您能够检查原始XML级别的传入和传出消息,这样,Provider就是客户端上Dispatch的对应部分。

答案 2 :(得分:3)

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

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

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

例如:

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

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