1.6. 高级配置映射


以下高级映射步骤是特定于红帽构建的 Quarkus 的扩展,位于 MicroProfile 配置规范之外。

1.6.1. 使用 @ConfigMapping 注解接口

使用 @io.smallrye.config.ConfigMapping 注释来分组配置属性,而不是单独注入多个相关的配置值。以下流程描述了如何使用 Quarkus config-quickstart 项目上的 @ConfigMapping 注释。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。
  • 您已在项目的 application.properties 文件中定义 greeting.messagegreeting.name 属性。

步骤

  1. 查看项目中的 GreetingResource.java 文件,并确保该文件包含下例中所示的内容。要使用 @ConfigProperty 注释将另一个配置源的配置属性注入此类,您必须导入 java.util.Optionalorg.eclipse.microprofile.config.inject.ConfigProperty 软件包。

    GreetingResource.java 文件示例

    package org.acme.config;
    
    import java.util.Optional;
    
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import jakarta.ws.rs.Produces;
    import jakarta.ws.rs.core.MediaType;
    
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    
    @Path("/greeting")
    public class GreetingResource {
    
        @ConfigProperty(name = "greeting.message")
        String message;
    
        @ConfigProperty(name = "greeting.suffix", defaultValue="!")
        String suffix;
    
        @ConfigProperty(name = "greeting.name")
        Optional<String> name;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return message + " " + name.orElse("world") + suffix;
        }
    }
    Copy to Clipboard Toggle word wrap

  2. src/main/java/org/acme/config 目录中创建一个 GreetingConfiguration.java 文件。在文件中添加 ConfigMap 和 Optional 的导入语句:

    GreetingConfiguration.java 文件示例

    package org.acme.config;
    
    import io.smallrye.config.ConfigMapping;
    import io.smallrye.config.WithDefault;
    import java.util.Optional;
    
    @ConfigMapping(prefix = "greeting") 
    1
    
    public interface GreetingConfiguration {
        String message();
    
        @WithDefault("!") 
    2
    
        String suffix();
    
        Optional<String> name();
    }
    Copy to Clipboard Toggle word wrap

    1
    prefix 属性是可选的。例如,在这种情况下,前缀为 greeting
    2
    如果没有设置 greeting.suffix,则使用 ! 作为默认值。
  1. 使用 @Inject 注释将 GreetingConfiguration 实例注入到 GreetingResource 类中,如下所示:

    注意

    此片段将标注为 @ConfigProperty 的三个字段替换为 config-quickstart 项目初始版本中的 @ConfigProperty。

    GreetingResource.java 文件示例

    package org.acme.config;
    
    import jakarta.inject.Inject;
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import jakarta.ws.rs.Produces;
    import jakarta.ws.rs.core.MediaType;
    
    @Path("/greeting")
    public class GreetingResource {
    
        @Inject
        GreetingConfiguration config;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return config.message() + " " + config.name().orElse("world") + config.suffix();
        }
    }
    Copy to Clipboard Toggle word wrap

  2. 在开发模式下编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    如果没有为类属性提供值,则应用无法编译,并且返回 io.smallrye.config.ConfigValidationException 错误来指示缺少值。这不适用于带有默认值的可选字段或字段。

  3. 要验证端点是否返回消息,请在新的终端窗口中输入以下命令:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  4. 您会收到以下信息:

    hello quarkus!
    Copy to Clipboard Toggle word wrap
  5. 要停止应用程序,请按 Ctrl+C。

1.6.2. 使用嵌套对象配置

您可以定义嵌套在另一个接口中的接口。此流程演示了如何在 Quarkus config-quickstart 项目中创建和配置嵌套接口。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。
  • 您已在项目的 application.properties 文件中定义 greeting.messagegreeting.name 属性。

步骤

  1. 查看项目中的 GreetingResource.java。该文件包含带有 hello () 方法的 GreetingResource 类,它会在 /greeting 端点上发送 HTTP 请求时返回一条消息:

    GreetingResource.java 文件示例

    package org.acme.config;
    
    import java.util.Optional;
    
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import jakarta.ws.rs.Produces;
    import jakarta.ws.rs.core.MediaType;
    
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    
    @Path("/greeting")
    public class GreetingResource {
    
        @ConfigProperty(name = "greeting.message")
        String message;
    
        @ConfigProperty(name = "greeting.suffix", defaultValue="!")
        String suffix;
    
        @ConfigProperty(name = "greeting.name")
        Optional<String> name;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return message + " " + name.orElse("world") + suffix;
        }
    }
    Copy to Clipboard Toggle word wrap

  2. 使用 GreetingConfiguration.java 类文件创建 GreetingConfiguration.java 类文件。此类包含 hello () 方法的外部化配置,该方法在 GreetingResource 类中定义的:

    GreetingConfiguration.java 文件示例

    package org.acme.config;
    
    import io.smallrye.config.ConfigMapping;
    import io.smallrye.config.WithDefault;
    import java.util.Optional;
    
    @ConfigMapping(prefix = "greeting")
    public interface GreetingConfiguration {
        String message();
    
        @WithDefault("!")
        String suffix();
    
        Optional<String> name();
    }
    Copy to Clipboard Toggle word wrap

  3. 创建嵌套在 GreetingConfiguration 实例中的 ContentConfig 接口,如下例所示:

    GreetingConfiguration.java 文件示例

    package org.acme.config;
    
    import io.smallrye.config.ConfigMapping;
    import io.smallrye.config.WithDefault;
    
    import java.util.List;
    import java.util.Optional;
    
    @ConfigMapping(prefix = "greeting")
    public interface GreetingConfiguration {
        String message();
    
        @WithDefault("!")
        String suffix();
    
        Optional<String> name();
    
        ContentConfig content();
    
        interface ContentConfig {
            Integer prizeAmount();
    
            List<String> recipients();
        }
    }
    Copy to Clipboard Toggle word wrap

    注意

    ContentConfig 接口的方法名称是 内容。要确保将属性绑定到正确的接口,当您为此类定义配置属性时,请在前缀中使用 内容。这样,您还可以防止属性名称冲突和意外的应用程序行为。

  4. application.properties 文件中定义 greeting.content.prize-amountgreeting.content.recipients 配置属性。

    以下示例显示了为 GreetingConfiguration 实例和 ContentConfig 接口定义的属性:

    application.properties 文件示例

    greeting.message=hello
    greeting.name=quarkus
    greeting.content.prize-amount=10
    greeting.content.recipients=Jane,John
    Copy to Clipboard Toggle word wrap

  5. 使用 @Inject 注释,而不是三个 @ConfigProperty 字段注释,将 GreetingConfiguration 实例注入到 GreetingResource 类中,如以下示例中所述。另外,您必须更新 /greeting 端点返回的消息字符串,为新的 greeting. content.prize-amount 和 greeting.content.recipients 属性设置的值。

    GreetingResource.java 文件示例

    package org.acme.config;
    
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import jakarta.ws.rs.Produces;
    import jakarta.ws.rs.core.MediaType;
    
    import jakarta.inject.Inject;
    
    @Path("/greeting")
    public class GreetingResource {
    
        @Inject
        GreetingConfiguration config;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return config.message() + " " + config.name().orElse("world")
                    + config.suffix() + "\n" + config.content().recipients()
                    + " receive total of candies: "
                    + config.content().prizeAmount();
        }
    }
    Copy to Clipboard Toggle word wrap

  6. 在开发模式下编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    如果没有为类属性提供值,应用程序将无法编译,并且您收到表示缺少值的 jakarta.enterprise.inject.spi.DeploymentException 异常。这不适用于带有默认值的可选字段和字段。

  7. 要验证端点是否返回消息,请打开一个新的终端窗口并输入以下命令:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap

    这时将显示一条消息,其中包含 输出的两行。第一行显示问候语,第二行报告奖品的接收者和奖品量,如下所示:

    hello quarkus!
    [Jane, John] receive total of candies: 10
    Copy to Clipboard Toggle word wrap
  8. 要停止应用程序,请按 Ctrl+C。
注意

您可以使用类似以下示例的 bean 验证注解 @ConfigMapping 注解的类:

@ConfigMapping(prefix = "greeting")
public class GreetingConfiguration {

    @Size(min = 20)
    public String message;
    public String suffix = "!";
}
Copy to Clipboard Toggle word wrap

您的项目必须包含 quarkus-hibernate-validator 依赖项。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat