JAX-RS中的提供者是什么意思?


110

谁能向我解释什么是JAX-RS提供程序,什么是'@Provider'注释?我一直在阅读文档,但无法理解。
如果存在为传入请求提供服务的资源类,提供者将做什么?当我创建一个持久性资源类(不是每个请求一个)时,它们与单例资源类有何不同?还是那些课程也是提供者?


与此对应:为什么JAX-RS文档没有在“提供者”一章的第一段中对此进行解释,这是我在寻求理解时转向的逻辑页面。JAX-RS文档PDF
Jonathan Komar,

Answers:


138

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

供应商是一样的资源类,它们的存在,在概念上,在资源类和JAX-RS实现在两者之间的水平。如果有帮助,您可以从与设备驱动程序(用户空间和内核空间之间存在)相同的角度来考虑它们。这是一个广义的概括。

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


实体提供者

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

上下文提供者

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

例外提供者

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


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

JAX-RS规范是对这些不同类型的供应商和他们做了什么(见第4章)读了一个很好的参考。


谢谢。我想我知道这件事=)
Artem Moskalev 2012年

好解释@Perception。这确实有助于我的理解。
L-塞缪尔2014年

好解释。但是,有一个问题-@provider实现与通过web.xml中的init参数(jersey.config.server.provider.classnames)注入的javax.ws.rs.core.Feature接口实现有何不同?订单如何控制?
安迪·杜弗雷斯

请注意最新版本的JAX-RS规范(2.1版最终版本,2017年7月13日)download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…–
burntsugar

13

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

@Provider批注使您能够在原始XML级别检查传入和传出的消息,并且Provider以这种方式与客户端上的Dispatch相对。


6

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

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

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

例如:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.