升级概览
Quarkus 2.8.0.Final发布,特性包括:将RESTEasy Reactive作为默认 REST 层;将 GraalVM 22.0 作为默认版本;新的QuarkusTransaction
API;以及 Elasticsearch Dev Services(可以自动启动dev
和test
模式的 Elasticsearch 容器)。此外,由于存在二进制兼容性不可靠问题,AssertJ被从 Quarkus BOM 中删除。开发人员需要在他们的应用程序中明确指定 AssertJ 3.22.0
改动
默认集成了RESTEasy Reactive REST层和GraalVM 22.0。细粒度的编程事务API提供了对事务的更多控制。
引入了RESTEasy Reactive 集成,这是JAX-RS的反应式实现,由Vert.x实现。在这个版本中,RESTEasy Reactive 现在是默认的实现,支持阻塞和反应式调用,根据端点的返回类型自动选择。
REST服务器的所有依赖quarkus-resteasy
都应该被quarkus-resteasy-Reactive
替代,除了quarkus-resteasy-mutiny
,因为它的功能集成在RESTEasy Reactive中。
注释替换,比如org.jboss.resteasy.annotations.jaxrs。QueryParam,应该被org.jboss.resteasy替换。响应式注释,如org.jboss.resteasy.reactive.RestQuery。
REST客户端实现应该用quarkus-rest-client-reactive*
*依赖项取代quarkus-rest-client*
依赖项。RESTEasy Reactive迁移指南和参考指南提供了进一步的迁移指南。
QuarkusTransaction API
QuarkusTransaction API现在提供了一个编程API,通过显式调用begin()和commit()方法来控制事务:
代码语言:javascript复制QuarkusTransaction.begin();
// implementation
QuarkusTransaction.commit();
该事务被绑定到CDI请求范围,并在异常破坏请求范围时自动回滚。或者,也可以在超时发生时启动事务并回滚:
代码语言:javascript复制QuarkusTransaction.begin(QuarkusTransaction.beginOptions()
.timeout(42));
// implementation
QuarkusTransaction.rollback();
Lambda作用域事务通过在事务中执行Runnable提供了另一种选择:
代码语言:javascript复制QuarkusTransaction.run(() -> {
// implementation
});
另外,也可以使用支持异常处理和枚举语义 DISALLOW_EXISTING, JOIN_EXISTING, SUSPEND_EXISTING, REQUIRE_NEW(默认)的Callable解决方案:
代码语言:javascript复制int answer = QuarkusTransaction.call(QuarkusTransaction.runOptions()
.timeout(21) .exceptionHandler((throwable) -> {
if (throwable instanceof RuntimeException) { return RunOptions.ExceptionResult.COMMIT;
} return RunOptions.ExceptionResult.ROLLBACK;
}) .semantic(RunOptions.Semantic.REQUIRE_NEW), () -> {
// implementation
return 42;
});
将GraalVM 22.0作为默认版本,在构建本地映像时提供了改进的日志记录。
Quarkus现在支持OpenID连接(OIDC)的密钥交换证明(PKCE),这是OAuth 2.0协议上的一个身份层。PKCE是OAuth 2.0的扩展,以减轻公共客户端请求访问令牌时的安全威胁。
维护者决定从物料清单(BOM)中删除AssertJ,因为新版本经常会破坏二进制兼容性。项目现在应该显式声明AssertJ 3.22.0,目前是最新版本。
当使用Elasticsearch扩展名时,在Dev和test模式下运行测试时,Elasticsearch服务会自动启动一个Elasticsearch容器,除非显式禁用,例如,quarkus.devservices.enabled设置为false。