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

Java JAX-RS中的提供者是什么意思?,java,jersey,jax-rs,Java,Jersey,Jax Rs,谁能给我解释一下JAX-RS提供者是什么,以及“@Provider”注释的作用是什么?我一直在阅读文档,但我无法获得它。 如果存在为传入请求提供服务的资源类,那么提供者会做什么?当我创建一个持久资源类(不是每个请求的资源类)时,它们与单例资源类有何不同?或者这些类也是提供者吗?提供者只是扩展和定制JAX-RS运行时的一种方式。您可以将它们视为(可能)改变运行时行为的插件,以实现一组(程序定义的)目标 提供者与资源类不同,它们在概念上存在于资源类和JAX-RS实现之间的一个级别。如果有帮助的话,您

谁能给我解释一下JAX-RS提供者是什么,以及“@Provider”注释的作用是什么?我一直在阅读文档,但我无法获得它。

如果存在为传入请求提供服务的资源类,那么提供者会做什么?当我创建一个持久资源类(不是每个请求的资源类)时,它们与单例资源类有何不同?或者这些类也是提供者吗?

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

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

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


实体提供商

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

上下文提供程序

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

异常提供程序

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


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


对于阅读这些不同的提供程序类型以及它们所做的工作,是一个很好的参考。

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


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

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

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

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

例如:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
。。。
@提供者
公共类AppExceptionMapper实现ExceptionMapper{
...
...
@提供者
@预匹配
公共类RESTRequestResponseFilter实现ContainerRequestFilter、ContainerResponseFilter{
...

谢谢。我想我明白了这件事=)解释得很好@Perception。这确实有助于我的理解。解释得很好。不过有一个问题,@provider实现与通过init参数(jersey.config.server.provider.classnames)注入的javax.ws.rs.core.Feature接口的实现有何不同在web.xml中?订单是如何控制的?请注意最新版本的JAX-RS规范(版本2.1最终版本2017年7月13日)来说明这一点:为什么JAX-RS文档没有在“提供者”一章的第一段中解释这一点?这是我在寻求理解时翻到的逻辑页面。