1.7. 影响与早期版本兼容性的更改


这部分论述了红帽构建的 Quarkus 3.2 中的更改,它会影响与之前产品版本构建的应用程序的兼容性。

查看这些破坏的变化,并执行必要的步骤,以确保应用程序在将其更新至 Quarkus 3.2 的红帽构建后继续运行。

要自动执行许多这些更改,请使用 quarkus update 命令将项目更新至最新的红帽构建的 Quarkus 版本

1.7.1. 云

Kubernetes 客户端已从 5.12 升级到 6.7.2。如需更多信息,请参阅 Kubernetes 客户端 - 从 5.x 迁移到 6.x 指南。

1.7.1.2. 改进了生成基于 TLS 的容器端口的逻辑

Red Hat build of Quarkus 3.2 引入了 Kubernetes 扩展如何生成基于 TLS 的容器端口的更改。

早期版本会自动将名为 https 的容器端口添加到生成的部署资源。这个方法可能会造成问题,特别是在没有配置 SSL/TLS 时,导致端口无法正常工作。

在 3.2 及更高版本中,Kubernetes 扩展默认不添加名为 https 的容器端口。只有在执行以下步骤时,才会添加容器端口:

  • 您可以在 application .properties 文件中指定任何相关的 quarkus.http.ssl prerequisites 属性。
  • 您可以在 application.properties 文件中设置 quarkus.kubernetes.ports.https.tls=true

1.7.1.3. 删除一些 Kubernetes 和 OpenShift 属性

在这个版本中,一些之前已弃用的 Kubernetes 和 OpenShift 相关的属性已被删除。使用新的对应项替换它们。

Expand
表 1.1. 删除的属性及其新对应项
删除的属性新属性

quarkus.kubernetes.expose

quarkus.kubernetes.ingress.expose

quarkus.openshift.expose

quarkus.openshift.route.expose

quarkus.kubernetes.host

quarkus.kubernetes.ingress.host

quarkus.openshift.host

quarkus.openshift.route.host

quarkus.kubernetes.group

quarkus.kubernetes.part-of

quarkus.openshift.group

quarkus.openshift.part-of

另外,在这个版本中,没有 quarkus. 前缀的属性将被忽略。例如,在这个版本之前,如果您添加了 kubernetes.name 属性,它被映射到 quarkus.kubernetes.name。为了避免异常,如从 2.16.0.Final 升级到 2.16.1 时java.lang.ClassCastException。Final #30850 将不再进行。

当您继续在 Quarkus 上下文中使用 Kubernetes 和 OpenShift 时,请使用新属性,并在需要时包含 quarkus. 前缀。

1.7.2. Core

1.7.2.1. 升级到 Jandex 3

在这个版本中,Jandex 成为 SmallRye 项目的一部分,将所有 Jandex 项目整合到单个存储库中: https://github.com/smallrye/jandex/。因此,Jandex Maven 插件的新版本随 Jandex 内核一起提供。

此发行版本还会更改 Maven 协调。将旧的协调替换为新协调。

Expand
表 1.2. 旧协调及其新的对应部分

旧协调

新协调

org.jboss:jandex

io.smallrye:jandex

org.jboss.jandex:jandex-maven-plugin

io.smallrye:jandex-maven-plugin

如果使用 Maven Enforcer 插件,请将其配置为对 org.jboss:jandex 的任何依赖项。Gradle 用户提供了一个等同的插件。

1.7.2.2. Jandex API 用户的迁移路径

Jandex 3 包含很多有趣的功能和改进。不幸的是,这些更改需要一些破坏的更改。以下是推荐的迁移路径:

  1. 升级到 Jandex 2.4.3.Final。此版本为 Jandex 3.0.0 中更改的一些方法提供了替换。例如,不使用 ClassInfo.annotations (),使用 annotationsMap (),并将 MethodInfo.parameters () 替换为 parameterTypes ()。使用 Jandex 标记为已弃用的任何方法停止。
  2. 确保不使用 return 值 Indexer.index ()indexClass ()
  3. 如果您根据 Jandex 2.4.3.Final 编译代码,它可以针对 2.4.3.Final 和 3.0.0 运行。然而,这有一些例外。如果您实现 IndexView 接口,或者在某些情况下,依赖 UnresolvedTypeVariable 类,则无法使项目与 Jandex 2.4.3 和 Jandex 3 兼容。
  4. 升级到 Jandex 3.0.0.如果您实施 IndexView 接口,请确保实施添加的方法。如果您广泛使用 Jandex Type 层次结构,请验证是否需要处理 TypeVariableReference,它现在用来代表递归类型变量。

在此发行版本中,Jandex 引入了一个新的文档站点。尽管它是正在进行的工作,但随着时间的推移将变得更加全面。如需更多信息,您还可以参考改进的 Jandex Javadoc。

在这个版本中,之前弃用的 io.quarkus.arc.config.ConfigProperties 注解已被删除。

反之,使用 io.smallrye.config.ConfigMapping 注解来注入多个相关的配置属性。

如需更多信息,请参阅 "Mapping configuration to objects" 指南中的 @ConfigMapping 部分。

在这个版本中,不支持在私有方法上声明拦截器绑定注解,并触发构建失败;例如:

jakarta.enterprise.inject.spi.DeploymentException: @Transactional does not affect method com.acme.MyBean.myMethod() because the method is private. [...]
Copy to Clipboard Toggle word wrap

在早期版本中,声明私有方法上的拦截器绑定注解仅在日志中触发警告,但会被忽略。

这个支持更改旨在防止在私有方法中意外使用拦截器注解,因为它们没有影响,并可能导致混淆。

要解决这一更改,请从私有方法中删除此类注释。如果删除这些注解不可行,您可以将配置属性 quarkus.arc.fail-on-intercepted-private-method 设置为 false。此设置将系统恢复到之前的行为,其中只记录警告。

1.7.2.5. 删除 @AlternativePriority 注释

此发行版本删除了之前已弃用的 @AlternativePriority 注释。将它替换为 @Alternative@Priority 注释。

示例: Removed 注解

@AlternativePriority(1)
Copy to Clipboard Toggle word wrap

示例:替换注解

@Alternative
@Priority(1)
Copy to Clipboard Toggle word wrap

使用带有 @ Priority 注解的 jakarta.annotation.Priority 而不是 io.quarkus.arc.Priority,该注解已弃用,并计划在以后的发行版本中删除。两个注解都执行相同的功能。

此发行版本更新了 Mockito 版本 5.x。值得注意的是,Mockito 将默认的模拟制造商切换为 50.0 发行版中内联

但是,要保留自 Quarkus 1.x 起熟悉了模拟行为 Quarkus 用户,并防止出现大量 测试套件的内存泄漏,Quarkus 3.0 将 mockmaker 修复到 子类,而不是 内联,直到后者被完全支持。

如果要强制使用 内联 模拟制造商,请按照以下步骤执行:

  1. 将以下排除项添加到 pom.xml 中:

    <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-junit5-mockito</artifactId>
       <exclusions>
           <exclusion>
               <groupId>org.mockito</groupId>
               <artifactId>mockito-subclass</artifactId>
           </exclusion>
       </exclusions>
    <dependency>
    Copy to Clipboard Toggle word wrap
  2. 在您的依赖项中添加 mockito-core
  3. Mockito 5.3 删除了 mockito-inline 工件:您可以从依赖项中删除它。

1.7.2.7. 更新至最低支持的 Maven 版本

Quarkus 已嵌套其 Maven 插件,以支持 Maven 3.9。因此,Quarkus 支持的最小 Maven 版本从 3.6.2 提升到 3.8.6 或更高版本。确保您的开发环境已相应地更新,以从最新的改进和功能中受益。

1.7.2.8. 删除 quarkus-bootstrap-maven-plugin

在这个版本中,之前弃用的 io.quarkus:quarkus-bootstrap-maven-plugin Maven 插件已被删除。

此插件仅用于 Quarkus 扩展开发。因此,如果您要开发自定义 Quarkus 扩展,您必须将工件 ID 从 io.quarkus:quarkus-bootstrap-maven-plugin 改为 io.quarkus-extension-maven-plugin

注意

这个更改专门用于自定义扩展开发。对于标准应用程序开发,您可以使用 quarkus-maven-plugin 插件。

1.7.2.9. Mutiny 2 移至 Java 流

Mutiny 是一个被动编程库,其版本 1.x 基于 org.reactivestream 接口,而版本 2 基于 java.util.concurrent.Flow。这些 API 相同,但软件包名称已更改。

Mutiny 提供在 Mutiny 2 (Flow API)和其他带有传统重新主动流 API 的其他库之间桥接的适配器。

1.7.3. data

1.7.3.1. 使用 Panache 方法删除 Hibernate ORM

在这个 3.2 发行版本中,以下来自使用 Panache 和 Hibernate ORM 的 Hibernate ORM 方法已被删除:

  • io.quarkus.hibernate.orm.panache.PanacheRepositoryBase#getEntityManager(Class<?> clazz)
  • io.quarkus.hibernate.orm.panache.kotlin.PanacheRepositoryBase#getEntityManager (clazz: KClass<Any>)

反之,使用 Panache.getEntityManager (Class<?> clazz) 方法。

在这个版本中,Hibernate Object-Relational Mapping (ORM)扩展已更改为将 automatic IN 子句参数 padding 作为默认设置。这提高了对包含 IN 子句的查询的缓存效率。

要恢复到之前的功能并取消激活此功能,您可以将 quarkus.hibernate-orm.query.in-clause-parameter-padding 的属性值设置为 false

在这个版本中,Quarkus 依赖于 Hibernate Reactive 2 扩展而不是 Hibernate Reactive 1。这个变化意味着行为和数据库模式期望有一些变化,它们与早期版本不兼容。

大多数更改都与 Hibernate Reactive 2 相关,具体取决于 Hibernate ORM 6.2 而不是 Hibernate ORM 5.6。

重要

Hibernate Reactive 2 扩展在红帽构建的 Quarkus 3.2 中作为技术预览提供。

如需更多信息,请参阅以下资源:

1.7.3.4. Hibernate 搜索更改

GeoPoint 字段中对 projectablesortable 的默认设置的更改

在这个 3.2 发行版本中,Hibernate Search 6.2 更改了为 GeoPoint 字段处理默认值的方式。

假设您的 Hibernate Search 映射包含 GeoPoint 字段,该字段使用 projectable 选项的默认值,以及 排序选项的默认值或 Sortable.NO。在这种情况下,因为这些字段中缺少 doc 值,Elasticsearch 模式在启动时验证会失败。

要防止这个失败,请完成以下步骤之一:

  • 通过将 projectable = Projectable.NO 添加到相关 GeoPoint 字段的映射注解来恢复到之前的默认值。
  • 重新创建 Elasticsearch 索引并重新索引您的数据库。执行此操作的最简单方法是将 MassIndexerdropAndCreateSchemaOnStart (true) 搭配使用。

如需更多信息,请参阅 "Hibernate Search 6.2.1.Final: Migration Guide from 6.1" 中的数据格式和模式更改 部分。

弃用或重命名的配置属性

在这个 3.2 发行版本中,quarkus.hibernate-search-orm.automatic-indexing.synchronization.strategy 属性已弃用,并计划在以后的版本中删除。改为使用 quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy 属性。

另外,quarkus.hibernate-search-orm.automatic-indexing.enable-dirty-check 属性已被弃用,计划在以后的版本中删除。没有可替换它的替代选择。删除后,计划 Search 会在事务修改对象字段后始终触发重新索引。也就是说,如果事务使字段"dirty"。

如需更多信息,请参阅"Hibernate Search 6.2.1.Final: Migration Guide from 6.1"中的 配置更改 部分。

在这个版本中,Quarkus 不支持手动创建 ValidatorFactory 实例。反之,您必须使用 Validation.buildDefaultValidatorFactory () 方法,它返回由 Quarkus 管理的 ValidatorFactory 实例,您通过上下文和依赖注入(CDI)注入。此更改的主要原因是,必须仔细设计 ValidatorFactory 才能在原生可执行文件中工作。在此发行版本中,您仍然可以手动创建 ValidatorFactory 实例,并在可能正常工作的情况下自行处理它。此更改旨在提高与组件的兼容性,创建自己的 ValidatorFactory

如需更多信息,请参阅以下资源:

1.7.3.6. quartz 作业类名称更改

如果您使用 Java 数据库连接(JDBC)将 Quartz 扩展 的作业存储在数据库中,请运行以下查询来更新 JOB_DETAILS 表中的作业类名称:

UPDATE JOB_DETAILS SET JOB_CLASS_NAME = 'io.quarkus.quartz.runtime.QuartzSchedulerImpl$InvokerJob' WHERE JOB_CLASS_NAME = 'io.quarkus.quartz.runtime.QuartzScheduler$InvokerJob';
Copy to Clipboard Toggle word wrap

QuarkusTransaction.runQuarkusTransaction.call 方法已弃用,现在使用新的、更明确的方法。

更新依赖于这些已弃用方法的代码,如下所示:

之前

QuarkusTransaction.run(() -> { ... });
QuarkusTransaction.call(() -> { ... });
Copy to Clipboard Toggle word wrap

After

QuarkusTransaction.requiringNew().run(() -> { ... });
QuarkusTransaction.requiringNew().call(() -> { ... });
Copy to Clipboard Toggle word wrap

之前

QuarkusTransaction.run(QuarkusTransaction.runOptions()
        .semantic(RunOptions.Semantic.REQUIRED),
        () -> { ... });
QuarkusTransaction.call(QuarkusTransaction.runOptions()
        .semantic(RunOptions.Semantic.REQUIRED),
        () -> { ... });
Copy to Clipboard Toggle word wrap

After

QuarkusTransaction.joiningExisting().run(() -> { ... });
QuarkusTransaction.joiningExisting().call(() -> { ... });
Copy to Clipboard Toggle word wrap

之前

QuarkusTransaction.run(QuarkusTransaction.runOptions()
        .timeout(10)
        .exceptionHandler((throwable) -> {
            if (throwable instanceof SomeException) {
               return RunOptions.ExceptionResult.COMMIT;
            }
            return RunOptions.ExceptionResult.ROLLBACK;
        }),
        () -> { ... });
QuarkusTransaction.call(QuarkusTransaction.runOptions()
        .timeout(10)
        .exceptionHandler((throwable) -> {
            if (throwable instanceof SomeException) {
               return RunOptions.ExceptionResult.COMMIT;
            }
            return RunOptions.ExceptionResult.ROLLBACK;
        }),
        () -> { ... });
Copy to Clipboard Toggle word wrap

After

QuarkusTransaction.requiringNew()
        .timeout(10)
        .exceptionHandler((throwable) -> {
            if (throwable instanceof SomeException) {
               return RunOptions.ExceptionResult.COMMIT;
            }
            return RunOptions.ExceptionResult.ROLLBACK;
        })
        .run(() -> { ... });
QuarkusTransaction.requiringNew()
        .timeout(10)
        .exceptionHandler((throwable) -> {
            if (throwable instanceof SomeException) {
               return RunOptions.ExceptionResult.COMMIT;
            }
            return RunOptions.ExceptionResult.ROLLBACK;
        })
        .call(() -> { ... });
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅 "Using transaction in Quarkus" 指南中的 Programmatic method 部分。

1.7.3.8. 重命名 Narayana 事务管理器属性

在这个版本中,quarkus.transaction-manager.object-store-directory 配置属性被重命名为 quarkus.transaction-manager.object-store.directory。通过将旧属性名称替换为新属性来更新您的配置。

1.7.4. 消息传递

此发行版本删除了之前为 smallrye-reactive-messaging-kafka 扩展已弃用的 vertx-kafka-client 依赖项。虽然它不用于客户端实现,vertx-kafka-clientio.vertx.kafka.buffer.Buffer 软件包提供了默认的 Kafka Serialization 和 Deserialization (SerDes),io.vertx.core.json.JsonObject, 和 io.vertx.core.json.JsonArray 类型来自 io.vertx.kafka.client.serialization 软件包。

如果您需要这个依赖项,您可以获取 io.quarkus.kafka.client.serialization 软件包中上述类型的 SerDe。

1.7.5. 原生

1.7.5.1. 原生编译 - 原生可执行文件和 .so 文件

在这个版本中,GraalVM/Mandrel 中的更改会影响对 .so 文件(如 Java Abstract Window Toolkit (AWT)扩展)的扩展。

在使用这些扩展时,您必须将对应的 .so 文件复制到原生容器中,例如:

COPY --chown=1001:root target/*.so /work/
COPY --chown=1001:root target/*-runner /work/application
Copy to Clipboard Toggle word wrap
注意

在这种情况下,AWT 扩展提供无头服务器端镜像处理功能,而不是 GUI 功能。

在这个 3.2 发行版本中,如果您在最新的机器上构建原生可执行文件并在较旧的机器上运行它们,您可能会在启动应用程序时遇到以下故障:

The current machine does not support all of the following CPU features that are required by the image: [CX8, CMOV, FXSR, MMX, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT, LZCNT, AVX, AVX2, BMI1, BMI2, FMA].
Please rebuild the executable with an appropriate setting of the -march option.
Copy to Clipboard Toggle word wrap

此错误消息表示,原生编译使用了运行应用的 CPU 不支持的更多高级指令集。要临时解决这个问题,请在 application.properties 文件中添加以下行:

quarkus.native.additional-build-args=-march=compatibility
Copy to Clipboard Toggle word wrap

然后,重建您的原生可执行文件。此设置强制原生编译使用旧的指令集,从而增加兼容性几率,但会降低优化。

要显式定义目标架构,请运行 native-image -march=list 来获取受支持的配置列表。然后,指定一个目标架构 ; 例如:

quarkus.native.additional-build-args=-march=x86-64-v4
Copy to Clipboard Toggle word wrap

如果您在旧的 AMD64 主机时遇到问题,请在使用 -march=x86-64-v2 前尝试 -march= x86-64-v2。

原生 镜像构建选项的 GraalVM 文档指出 "[the -march 参数生成] 指令用于特定机器类型。[This parameter] 默认为 AMD64 上的 x86-64-v3 和 AArch64 上的 armv8-a。使用 -march=compatibility 实现最佳兼容性,如果在同一台机器上或具有相同 CPU 功能的机器上部署原生可执行文件,则使用 -march=native 以获得最佳性能。要列出所有可用机器类型,请使用 -march=list "。

注意

-march 参数仅适用于 GraalVM 23 及更高版本。

1.7.5.3. 测试更改:删除一些注解

在这个版本中,之前弃用的 @io.quarkus.test.junit.NativeImageTest@io.quarkus.test.junit.DisabledOnNativeImageTest 注解是 rimage::images/ref_changes- that-affect-backward-compatibility-88d2f.png[].使用新的对应项替换它们。

Expand
表 1.3. 删除的注解及其新的对应部分
删除的注解新注解

@io.quarkus.test.junit.NativeImageTest

@io.quarkus.test.junit.QuarkusIntegrationTest

@io.quarkus.test.junit.DisabledOnNativeImageTest

@io.quarkus.test.junit.DisabledOnIntegrationTest

替换注解的功能等同于删除的注解。

1.7.6. Observability(可观察性)

在这个版本中,对 OpenTracing 驱动程序的支持已弃用。计划在以后的 Quarkus 版本中删除 OpenTracing 驱动程序。

在这个版本中,SmallRye GraphQL 扩展已替换为 OpenTelemetry 的 OpenTracing 集成。因此,在使用 OpenTracing 时,扩展不再为 GraphQL 操作生成 span。

另外,在这个版本中,quarkus.smallrye-graphql.tracing.enabled 配置属性已过时,并已被删除。相反,SmallRye GraphQL 扩展会在存在 OpenTelemetry 扩展时自动生成 span。

更新 Quarkus 应用程序以使用 OpenTelemetry,以便它们保持与将来的 Quarkus 版本兼容。

在这个 3.2 发行版本中,Micrometer 扩展默认以 application/openmetrics-text 格式导出指标,与 Prometheus 标准一致。此更改有助于使您的数据更易于阅读和解释。

要以较早格式获取指标,您可以将 Accept 请求标头改为 text/plain。例如,使用 'curl 命令:

curl -H "Accept: text/plain" localhost:8080/q/metrics/
Copy to Clipboard Toggle word wrap

1.7.7. 安全性

跨原始资源共享(CORS)过滤器的默认行为已进行了显著更改。在早期版本中,当启用 CORS 过滤器时,它默认支持所有原始卷。在这个 3.2 发行版本中,不再支持所有原始卷。现在,如果要允许所有原始卷,您必须明确将其配置为这样做。

在进行全面的评估后,如果您确定所有源都需要支持,请使用以下方法之一配置系统:

quarkus.http.cors=true
quarkus.http.cors.origins=/.*/
Copy to Clipboard Toggle word wrap

相同的原始请求会获得支持,而无需 quarkus.http.cors.origins 配置。因此,只有在允许信任的第三方源请求时,调整 quarkus.http.cors.origins 才会变得至关重要。在这种情况下,启用所有原始卷可能会造成不必要的风险。

警告

请谨慎使用此设置来保持最佳的系统安全性。

1.7.7.2. OpenAPI CORS 支持更改

在这个 3.2 发行版本中,OpenAPI 更改了其跨原始资源共享(CORS)设置,不再默认启用通配符(*)原始支持。这个更改有助于防止 OpenAPI 文档的潜在泄漏,提高应用程序的整体安全性。

虽然您可以在 dev 模式中启用通配符源支持,但务必要考虑潜在的安全影响。避免在生产环境中启用所有源,因为它会将您的应用程序暴露给安全威胁。确保您的 CORS 设置与您的生产环境的建议安全最佳实践一致。

1.7.7.3. 默认加密 OIDC 会话 Cookie

在这个 3.2 发行版本中,在 OIDC 授权代码流完成后创建的 OpenID Connect (OIDC)会话 cookie 被默认加密。在大多数情况下,您不太可能注意到这个变化。

但是,如果 mTLSprivate_key_jwt 验证方法 - OIDC 客户端私钥为 JSON Web Token (JWT)签名 - 在 Quarkus 和 OIDC 供应商之间使用,则会生成一个内存加密密钥。这个密钥生成可能会导致一些 pod 无法解密会话 Cookie,特别是在处理多个请求的应用程序中。当尝试解密 Cookie 的 pod 不是加密它的 pod 时,可能会出现这种情况。

如果出现问题,请注册 32 个字符的加密 secret;例如:

quarkus.oidc.token-state-manager.encryption-secret=eUk1p7UB3nFiXZGUXi0uph1Y9p34YhBU
Copy to Clipboard Toggle word wrap

加密会话 Cookie 不能超过 4096 字节,这可能会导致一些浏览器忽略它。如果出现这种情况,请尝试一个或多个以下步骤:

  • 设置 quarkus.oidc.token-state-manager.split-tokens=true,以便在单独的 Cookie 中存储 ID、访问和刷新令牌。
  • 如果不需要使用访问令牌作为角色源来请求 UserInfo 或将其传播到下游服务,则设置 quarkus.oidc.token-state-manager.strategy=id-refresh-tokens
  • 注册自定义 quarkus.oidc.TokenStateManager Context 和 Dependency Injection (CDI) bean,并将替代优先级设置为 1

如果应用程序用户从可信网络访问 Quarkus 应用程序,请通过应用以下配置来禁用会话 Cookie 加密:

quarkus.oidc.token-state-manager.encryption-required=false
Copy to Clipboard Toggle word wrap

在这个版本中,对于 Quarkus OpenID Connect (OIDC)扩展,会话 Cookie SameSite 属性默认设置为 Lax

在一些较早版本的 Quarkus 中,OIDC 会话 Cookie SameSite 属性默认设置为 Strict。此设置引入了不同浏览器处理会话 Cookie 的不可预测性。

1.7.7.5. 默认情况下验证 OIDC ID 令牌受众声明

在这个 3.2 发行版本中,默认验证 OpenID Connect (OIDC) ID 令牌 aud (audience)声明。这个声明必须与 OIDC 规格的要求相等配置的 quarkus.oidc.client-id 属性的值。

要覆盖预期的 ID 令牌 audience 值,请设置 quarkus.oidc.token.audience 配置属性。如果您处理没有设置 ID 令牌声明的不合规 OIDC 供应商,您可以将 quarkus.oidc.token.audience 设置为 任何

警告

quarkus.oidc.token.audience 设置为降低 3.2 应用程序的安全性。

1.7.7.6. 删除 JWT 密钥和密钥存储的默认密码

在此版本之前,Quarkus 使用 password 作为 JSON Web Token (JWT)密钥和密钥存储的默认密码。在这个版本中,这个默认值已被删除。

如果您仍然使用默认密码,请设置一个新值来替换 application.properties 文件中的以下属性 的密码

quarkus.oidc-client.credentials.jwt.key-store-password=password
quarkus.oidc-client.credentials.jwt.key-password=password
Copy to Clipboard Toggle word wrap

1.7.8. Web

1.7.8.1. 对 RESTEasy Reactive 多部分的更改

在这个版本中,以下更改会影响 RESTEasy Reactive 中的多部分支持:

  • 在此版本之前,您可以使用语法来捕获所有文件上传,而不考虑参数名称 :@RestForm List<FileUpload> all,但这不是模糊的,但这不是直观的。现在,此表单只获取名为 all 的参数,就像其它类型的所有其他形式元素一样,您必须使用以下形式来捕获每个参数,而不考虑其名称 :@RestForm (FileUpload.ALL) List<FileUpload> all
  • 多部分表单参数支持已添加到 @BeanParam 中。@MultipartForm 注释现已弃用。使用 @BeanParam 而不是 @MultipartForm
  • @BeanParam 现在是可选的,对于任何非annotated method 参数,它带有任何 @Rest*@*Param 注解的字段。
  • 多部分元素不再限制为封装在 @MultipartForm-annotated 类中:它们可用作方法端点参数和端点类字段。
  • 现在,多部分元素默认为 @PartType (MediaType.TEXT_PLAIN) MIME 类型,除非它们是 FileUpload,Path,File,byte[], 或 InputStream
  • MediaType.TEXT_PLAIN MIME 类型的多部分元素现在使用常规 ParamConverter 基础架构进行反序列化。在此发行版本中,反序列化使用 MessageBodyReader
  • FileUploadPathFilebyte[]InputStream 类型的多部分元素是特殊的案例,通过 RESTEasy Reactive 扩展,而不是 MessageBodyReaderParamConverter 类来反序列化。
  • 其他明确设置的 MIME 类型的多部分元素仍然使用适当的 MessageBodyReader 基础架构。
  • 现在,多部分元素可以嵌套在 List 中,以获取具有相同名称的部分的所有值。
  • 任何包含 @RestForm@FormParam 参数的客户端调用默认为 MediaType.APPLICATION_FORM_URLENCODED 内容类型,除非它们是 File,Path,Buffer,Multi<Byte& gt; , 或 byte[] 类型,在这种情况下,默认为 MediaType.MULTIPART_FORM_DATA 内容类型。
  • org.jboss.resteasy.reactive.server.core.multipart.MultipartFormDataOutput 已移到 org.jboss.resteasy.reactive.server.multipart.MultipartFormDataOutput
  • org.jboss.resteasy.reactive.server.core.multipart.PartItem 已移到 org.jboss.resteasy.reactive.server.multipart.PartItem
  • org.jboss.resteasy.reactive.server.core.multipart.FormData.FormValue 已移到 org.jboss.resteasy.reactive.server.multipart.FormValue
  • REST 客户端不再使用与 Jackson 关联的特定于服务器的 MessageBodyReaderMessageBodyWriter 类。在此版本之前,REST 客户端会意外地使用这些类。结果是,使用 quarkus-resteasy-reactive-jacksonquarkus-rest-client-reactive 扩展的应用程序现在必须包含 quarkus-rest-client-reactive-jackson 扩展。

1.7.8.2. 增强的 JAXB 扩展控制

JAXB 扩展检测使用 JAXB 注释的类,并将它们注册到默认的 JAXBContext 实例中。在此版本之前,类和 JAXB 之间的任何问题或冲突都会在运行时触发 JAXB 异常,并提供了有助于对问题进行故障排除的详细描述。但是,您可以在构建阶段预先处理这些冲突。

此发行版本添加了一个功能,可在构建时验证 JAXBContext 实例,以便您可以在开发周期早期检测和修复 JAXB 错误。

例如,如以下代码块中所示,将这两个类绑定到默认的 JAXBContext 实例会导致 JAXB 异常。这是因为类共享相同的名称 Model,尽管在不同的软件包中都存在。这个并发命名会创建一个冲突,从而导致异常。

package org.acme.one;

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Model {
    private String name1;

    public String getName1() {
        return name1;
    }

    public void setName1(String name1) {
        this.name1 = name1;
    }
}

package org.acme.two;

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Model {
    private String name2;

    public String getName2() {
        return name2;
    }

    public void setName2(String name2) {
        this.name2 = name2;
    }
}
Copy to Clipboard Toggle word wrap

要激活这个功能,请添加以下属性:

quarkus.jaxb.validate-jaxb-context=true
Copy to Clipboard Toggle word wrap

另外,这个版本添加了 quarkus.jaxb.exclude-classes 属性。使用此属性,您可以指定从绑定到 JAXBContext 的类。您可以提供完全限定类名称或软件包列表的逗号分隔列表。

例如,要解决上例中的冲突,您可以排除一个或多个类:

quarkus.jaxb.exclude-classes=org.acme.one.Model,org.acme.two.Model
Copy to Clipboard Toggle word wrap

或者,您可以排除软件包下的所有类:

quarkus.jaxb.exclude-classes=org.acme.*
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat