5.4. JAX-RS 和 RESTEasy 应用更改
JBoss EAP 6 捆绑了 RESTEasy 2,它是 JAX-RS 1.x 的实施。
JBoss EAP 7.0 和 JBoss EAP 7.1 包括 RESTEasy 3.0.x,这是 JSR 339: JAX-RS 2.0 定义的 JAX-RS 2.0 实施:RESTful Web 服务规范的 Java API。有关 RESTful Web 服务的 Java API 的更多信息,请参阅 JAX-RS 2.0 API 规格。
JBoss EAP 7.4 包含 RESTEasy 3.9.0,这是 Jakarta RESTful Web 服务 2.1 的实施。此发行版本还添加了对 JDK 11 的支持。虽然提供一些 RESTEasy 4 主要功能,但此版本基于 RESTEasy 3.0,确保完全向后兼容。因此,您应该在从 RESTEasy 3.0.x 迁移到 3.9.0 时遇到一些问题。有关 RESTEasy 3.9.0 的 Java API 的更多信息,请参阅 RESTEasy JAX-RS 3.9.0.Final API。
如果您要从 JBoss EAP 6.4 迁移,请注意 JBoss EAP 中包含的 Jackson 版本发生了变化。JBoss EAP 6.4 包括 Jackson 1.9.9。JBoss EAP 7 及更高版本现在包含 Jackson 2.6.3 或更高版本。
本节介绍这些更改如何影响使用 RESTEasy 或 JAX-RS 的应用。
5.4.1. resteasy 已弃用类
拦截器和 MessageBody 类
					JSR 311:JAX-RS:RESTful Web 服务的 Java™ API 没有包含拦截器框架,因此 RESTEasy 2 提供一个。JSR 339:JAX-RS 2.0:RESTful Web 服务的 Java API 引入了官方拦截器和过滤框架,因此 RESTEasy 2 中包含的拦截器框架现已弃用,并且被 RESTEasy 3.x 中的 JAX-RS 兼容拦截器功能所取代。相关的接口在 jaxrs-api 模块的 javax.ws.rs.ext 软件包中定义。
				
- 以下拦截器接口在 RESTEasy 3.x 中已被弃用。 
- 
							org.jboss.resteasy.spi.interception.PreProcessInterceptor接口被 RESTEasy 3.x 中的javax.ws.rs.container.ContainerRequestFilter接口替代。
- RESTEasy 3.x 中也弃用了下列接口和类。 - 
									org.jboss.resteasy.spi.interception.MessageBodyReaderInterceptor
- 
									org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor
- 
									org.jboss.resteasy.spi.interception.MessageBodyWriterContext
- 
									org.jboss.resteasy.spi.interception.MessageBodyReaderContext
- 
									org.jboss.resteasy.core.interception.InterceptorRegistry
- 
									org.jboss.resteasy.core.interception.InterceptorRegistryListener
- 
									org.jboss.resteasy.core.interception.ClientExecutionContextImpl
 
- 
									
- 
							org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor接口已被javax.ws.rs.ext.WriterInterceptor接口替代。
- 此外,对 - javax.ws.rs.ext.MessageBodyWriter接口的一些更改可能无法向后兼容 JAX-RS 1.x。如果您的应用使用了 JAX-RS 1.x,请检查您的应用程序代码,以确保为您的端点定义了- @Produces或- @Consumes。否则可能会导致类似如下的错误。- org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: <OBJECT> of media type: - org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: <OBJECT> of media type:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 以下是可能导致此错误的 REST 端点示例。 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 要解决此问题,请添加 - javax.ws.rs.Produces和- @Produces注释的导入,如下所示:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
来自以前版本的 RESTEasy 的所有拦截器都可以与新的 JAX-RS 过滤器和拦截器接口并行运行。
如需有关拦截器的更多信息,请参阅用于 JBoss EAP 开发 Web Services 应用中的 RESTEasy 拦截器。
如需有关新的替换 API 的更多信息,请参阅 RESTEasy JAX-RS 3.9.0.Final API。
客户端 API
					resteasy-jaxrs 中的 RESTEasy 客户端框架被 JBoss EAP 7.0 中的遵循 JAX-RS 2.0 的 resteasy-client 模块替代。因此,一些 RESTEasy 客户端 API 类和方法已弃用。
				
- 以下类已弃用。 
- 
							org.jboss.resteasy.client.ClientResponseFailure异常和org.jboss.resteasy.client.ClientExecutor和org.jboss.resteasy.client.EntityTypeFactory接口也已弃用。
- 您必须将 - org.jboss.resteasy.client.ClientRequest和- org.jboss.resteasy.client.ClientResponse类分别替换为- org.jboss.resteasy.client.jaxrs.ResteasyClient和- javax.ws.rs.core.Response。- 以下示例说明了如何在 RESTEasy 2.3.x 中与 RESTEasy 客户端发送一个链路标头。 - ClientRequest request = new ClientRequest(generateURL("/linkheader/str")); request.addLink("previous chapter", "previous", "http://example.com/TheBook/chapter2", null); ClientResponse response = request.post(); LinkHeader header = response.getLinkHeader();- ClientRequest request = new ClientRequest(generateURL("/linkheader/str")); request.addLink("previous chapter", "previous", "http://example.com/TheBook/chapter2", null); ClientResponse response = request.post(); LinkHeader header = response.getLinkHeader();- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 以下是如何使用 RESTEasy 3 中的 RESTEasy 客户端完成相同的任务。 - ResteasyClient client = new ResteasyClientBuilder().build(); Response response = client.target(generateURL("/linkheader/str")).request() .header("Link", "<http://example.com/TheBook/chapter2>; rel=\"previous\"; title=\"previous chapter\"").post(Entity.text(new String())); javax.ws.rs.core.Link link = response.getLink("previous");- ResteasyClient client = new ResteasyClientBuilder().build(); Response response = client.target(generateURL("/linkheader/str")).request() .header("Link", "<http://example.com/TheBook/chapter2>; rel=\"previous\"; title=\"previous chapter\"").post(Entity.text(new String())); javax.ws.rs.core.Link link = response.getLink("previous");- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 如需与 JAX-RS Web 服务交互的外部 JAX-RS RESTEasy 客户端的示例,请参阅 - resteasy-jaxrs-client快速入门。
- 
							org.jboss.resteasy.client.cache软件包中的类和接口也被弃用。它们由org.jboss.resteasy.client.jaxrs.cache软件包中对应的类和接口替代。
						有关 org.jboss.resteasy.client.jaxrs API 类的更多信息,请参见 RESTEasy JAX-RS JavaDoc。
					
StringConverter
					org.jboss.resteasy.spi.StringConverter 类在 RESTEasy 3.x 中被弃用。可以使用 JAX-RS jax.ws.rs.ext.ParamConverterProvider 类来替换此功能。
				
5.4.2. 删除或保护的 RESTEasy 类
ResteasyProviderFactory 添加方法
					大多数 org.jboss.resteasy.spi.ResteasyProviderFactory add() 方法已被删除或在 RESTEasy 3.0 中受到保护。例如,addBuiltInMessageBodyReader() 和 addBuiltInMessageBodyWriter() 方法已被删除,并且 addMessageBodyReader() 和 addMessageBodyWriter() 方法受保护。
				
					您现在应使用 registerProvider() 和 registerProviderInstance() 方法。
				
从 RESTEasy 3 中删除额外的类
					@org.jboss.resteasy.annotations.cache.ServerCached 注释指定对 JAX-RS 方法的响应应缓存在服务器上,并且必须从 RESTEasy 3 中删除。
				
5.4.3. 其他 RESTEasy 更改
SignedInput 和 SignedOuput
- 
							resteasy-crypto的SignedInput和SignedOutput必须在Request或Response对象中将Content-Type设置为multipart/signed,或使用@Consumes或@Produces注解。
- 
							SignedOutput和SignedInput可用于通过设置@Produces或@Consumes注释中的 type 以二进制格式返回应用程序/pkcs7-signatureMIME 类型格式。
- 
							如果 @Produces或@Consumes是text/plainMIME 类型,则SignedOutput将采用 base64 编码并作为 String 发送。
安全过滤器
					@RolesAllowed、@PermitAll 和 @DenyAll 的安全过滤器现在返回 "403 Forbidden" 而不是 "401 Unauthorized"。
				
客户端过滤器
从 RESTEasy 3.0 之前,从版本使用 RESTEasy 客户端 API 时,在 JAX-RS 2.0 中引入的客户端侧过滤器不会绑定并运行。
异步 HTTP 支持
					由于 JAX-RS 2.0 规范添加了利用 @Suspended 注释和 AsynResponse 接口的异步 HTTP 支持,因此用于异步 HTTP 的 RESTEasy 专有 API 已被弃用,并可能在以后的 RESTEasy 发行版中移除。异步 Tomcat 和异步 JBoss Web 模块也已从服务器安装中删除。如果您不使用 Servlet 3.0 容器或更高,则异步 HTTP 服务器端处理将模拟,并在同一个请求线程中异步运行。
				
服务器端缓存
服务器端缓存设置已更改。如需更多信息,请参阅 RESTEasy 文档。
YAML 供应商设置更改
					在以前的 JBoss EAP 版本中,RESTEasy YAML 供应商设置被默认启用。这在 JBoss EAP 7 中有所改变。现在默认禁用 YAML 供应商。由于 RESTEasy 用于 unmarshalling 的 SnakeYAML 库中的安全问题,它不被支持,因此必须在应用中明确启用。有关如何在应用程序中启用 YAML 供应商并添加 Maven 依赖项的信息,请参阅 为 JBoss EAP 开发 Web Services Applications 中的 YAML 供应商。
				
Content-Type Header 中的默认 Charset UTF-8
					自 JBoss EAP 7.1 起,resteasy.add.charset 参数默认设置为 true。当资源方法返回一个 text/* 或 application/xml* 媒介类型且没有明确的字符集时,如果您不希望 RESTEasy 将 charset=UTF-8 添加到返回的 content-type 头时,可以将 resteasy.add.charset 参数设置为 false。
				
如需有关文本媒体类型和字符集的更多信息,请参阅为 JBoss EAP 开发 Web 服务应用中的文本介质类型和字符集。
SerializableProvider
					从不受信任的源中反序列化 Java 对象是不安全的。因此,在 JBoss EAP 7 中,默认禁用 org.jboss.resteasy.plugins.providers.SerializableProvider 类,因此不建议使用这个提供程序。
				
将请求与资源方法匹配
在 RESTEasy 3 中,对匹配的规则实施进行了改进和修正,如 JAX-RS 规范中所定义。特别是,如何对子资源方法上的模糊的 URI 以及处理子资源松cator 时进行一个更改。
在 RESTEasy 2 中,即使存在具有相同 URI 的另一个子资源,也会让子资源 locator 成功执行。这个行为根据规格不正确。
					在 RESTEasy 3 中,当子资源和子资源松cator 存在模糊的 URI 时,调用子资源将成功;但是,调用子资源 locator 将导致 HTTP 状态 405 Method Not Allowed 错误。
				
					以下示例包含子资源方法和子资源 locator 上的模糊 @Path 注释。注意 URI 到端点( anotherResource 和 anotherResourceLocator )是相同的。两个端点的区别在于 anotherResource 方法与 REST 动词 POST 关联。anotherResourceLocator 方法不与任何 REST 动词关联。根据规范,将始终选择具有 REST 动词的端点(本例中为 anotherResource 方法)。
				
资源方法算法切换
在 3.0.25 之前的 RESTEasy 3.0.x 版本中使用的资源方法匹配算法中发现了一个错误,即 RESTEasy 在响应请求时返回太多的资源类型。
匹配算法有三个阶段:
- 使用请求路径来选择可能的资源类。
- 使用请求路径来选择可能的资源方法。
- 使用 HTTP 动词和介质类型 coming 和 going,选择最终的资源方法。
根据 JAX-RS 2.0 规范,在对潜在资源方法集合进行排序后,仅将最大元素传递给第 3 步。但是,在 RESTEasy 3.0.25 之前的 RESTEasy 3.0.x 实施将所有方法传递给第 3 步。JBoss EAP 7.1.0 中包含的 RESTEasy 3.0.24 表现出了这种行为不正确。
					RESTEasy 3.0.25 (包含在 JBoss EAP 7.1.1 中)提供了相应的修复,以限制传递到第 3 步要符合 JAX-RS 2.0 规范的方法。由于 looser 的行为可能更倾向于,因此 RESTEasy 3.0.25 还引入了 context-param 配置选项 resteasy.loose.step2.request.match(默认为 false ),它可以配置为启用旧行为。
				
					如果您将 JBoss EAP 服务器从 7.1.0 升级到 7.1.1,并且您希望保留旧行为,并将所有潜在的资源方法传递给第 3 步,将 resteasy.loose.step2.request.matching 选项设置为 true。
				
					在 JAX-RS 2.1 规范中更改了匹配的算法,将所有匹配的资源方法传递给第 3 步。RESTEasy 3.9.0 包含在 JBoss EAP 7.4 中,提供 jaxrs.2.0.request.matching 选项,以保留 JAX-RS 2.0 规范中定义的更严格的行为。
				
					如果您将应用程序从 JBoss EAP 从 7.1.0 迁移到 7.2.x,则不应在资源方法匹配算法的行为中看到更改。如果您将应用程序从 JBoss EAP 从 7.1.1 迁移到 7.2.x 或更高版本,并希望保留 JAX-RS 2.0 规范中定义的更严格的行为,将 jaxrs.2.0.request.matching 选项设置为 true。
				
5.4.4. resteasy SPI 更改
SPI Exceptions
所有 SPI 失败异常已被弃用,且不再在内部使用。它们已被对应的 JAX-RS 例外替代。
| 弃用的例外 | jaxrs-api模块中的替换 Exception | 
|---|---|
| org.jboss.resteasy.spi.ForbiddenException | javax.ws.rs.ForbiddenException | 
| org.jboss.resteasy.spi.MethodNotAllowedException | javax.ws.rs.NotAllowedException | 
| org.jboss.resteasy.spi.NotAcceptableException | javax.ws.rs.NotAcceptableException | 
| org.jboss.resteasy.spi.NotFoundException | javax.ws.rs.NotFoundException | 
| org.jboss.resteasy.spi.UnauthorizedException | javax.ws.rs.NotAuthorizedException | 
| org.jboss.resteasy.spi.UnsupportedMediaTypeException | javax.ws.rs.NotSupportedException | 
InjectoronnectionFactoryy 和 Registry
					InjectorFactory 和 Registry SPI 已更改。如果使用 RESTEasy 作为文档和支持,这不应有问题。
				
5.4.5. Jackson Provider Changes
					JBoss EAP 中包含的 Jackson 版本发生了变化。先前版本的 JBoss EAP 包括 Jackson 1.9.9。JBoss EAP 7 现在包含 Jackson 2.6.3 或更高版本。因此,Jackson 供应商已从 resteasy-jackson-provider 改为 resteasy-jackson2-provider。
				
					升级到 resteasy-jackson2-provider 需要一些软件包更改。例如,Jackson 注解软件包已从 org.codehaus.jackson.annotate 改为 com.fasterxml.jackson.annotation。
				
要切换应用程序以使用 JBoss EAP 之前版本中包含的默认供应商,请参阅在为 JBoss EAP 开发 Web Services Applications 中 切换 Default Jackson Provider。
5.4.6. Spring RESTEasy 集成更改
Spring 4.0 框架引入了对 Java 8 的支持。如果您计划使用 RESTEasy 3.x 与 Spring 集成,请确保将 4.2.x 指定为部署中最低 Spring 版本,因为这是 JBoss EAP 7 支持的最早的稳定版本。
5.4.7. resteasy Jettison JSON Provider Changes
					RESTEasy Jettison JSON 提供程序在 JBoss EAP 7 中已弃用,且不再默认添加到部署中。建议您切换到推荐的 RESTEasy Jackson 供应商。如果您希望继续使用 Jettison 提供程序,您必须在 jboss-deployment-descriptor.xml 文件中定义一个明确的依赖关系,如下例所示。
				
有关如何定义显式依赖项的更多信息,请参阅 JBoss EAP 开发指南中为部署添加解释模块依赖项。
5.4.8. MicroProfile Rest Client Code 所需的更改
JBoss EAP 7.3 支持 MicroProfile REST 客户端的版本 1.3.x。如果您使用旧版 MicroProfile REST 客户端,则需要在代码中进行一些更新。
MicroProfile REST 客户端仅作为技术预览提供。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。
					org.jboss.resteasy.client.microprofile.MicroprofileClientBuilderResolver 类被 org.eclipse.microprofile.rest.client.RestClientBuilder 替代。例如:
				
有关 MicroProfile REST 客户端的更多信息,请参阅 JBoss EAP 开发 Web 服务应用 指南中的 MicroProfile REST 客户端。
5.4.9. JBoss EAP 的 MicroProfile 配置
MicroProfile 配置是开发人员用来将应用和微服务配置为在多个环境中运行的规范名称,而无需修改或重新打包这些应用。在以前的版本中,MicroProfile Config 作为技术预览提供 JBoss EAP,但自此后已被删除。MicroProfile 配置现在仅适用于 JBoss EAP XP。