1.6. 高级配置映射
以下高级映射流程是特定于红帽构建的 Quarkus 的扩展,且位于 MicroProfile Config 规范之外。
1.6.1. 注解带有 @ConfigMapping 的接口 复制链接链接已复制到粘贴板!
使用 @io.smallrye.config.ConfigMapping 注解来分组配置属性,而不是单独注入多个相关配置值。以下流程描述了如何在 Quarkus config-quickstart 项目中使用 @ConfigMapping 注释。
先决条件
-
您已创建了 Quarkus
config-quickstart项目。 -
您已在项目的
application.properties文件中定义greeting.message和greeting.name属性。
流程
查看项目中的
GreetingResource.java文件,并确保该文件包含以下示例中显示的内容。要使用@ConfigPoperties注释,将另一个配置源的配置属性注入此类,您必须导入java.util.Optional和org.eclipse.microprofile.config.inject.ConfigProperty软件包。GreetingResource.java文件示例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; } }在
src/main/java/org/acme/config目录中创建一个GreetingConfiguration.java文件。将ConfigMapping和Optional的导入语句添加到文件中:GreetingConfiguration.java文件示例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(); }
使用
@Inject注释将GreetingConfiguration实例注入GreetingResource类,如下所示:注意此片段取代了在
config-quickstart项目的初始版本中标上@ConfigProperty的三个字段。GreetingResource.java文件示例@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(); } }以开发模式编译并启动应用程序:
./mvnw quarkus:dev重要如果没有为类属性提供值,应用程序将无法编译,并返回
io.smallrye.config.ConfigValidationException错误来指示缺少值。这不适用于带有默认值的可选字段或字段。要验证端点是否返回信息,请在一个新的终端窗口中输入以下命令:
curl http://localhost:8080/greeting您会收到以下信息:
hello quarkus!- 要停止应用程序,请按 Ctrl+C。
1.6.2. 使用嵌套对象配置 复制链接链接已复制到粘贴板!
您可以定义嵌套在另一个接口中的接口。此流程演示了如何在 Quarkus config-quickstart 项目中创建和配置嵌套接口。
先决条件
-
您已创建了 Quarkus
config-quickstart项目。 -
您已在项目的
application.properties文件中定义greeting.message和greeting.name属性。
流程
查看项目中的
GreetingResource.java。文件包含带有hello ()方法的GreetingResource类,该方法在/greeting端点上发送 HTTP 请求时返回一条消息:GreetingResource.java文件示例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; } }使用
GreetingConfiguration.java实例创建一个GreetingConfiguration.java 类文件。此类包含GreetingResource类中定义的hello ()方法的外部化配置:GreetingConfiguration.java文件示例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(); }创建嵌套在
GreetingConfiguration实例中的ContentConfig类,如下例所示:GreetingConfiguration.java文件示例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(); } }注意ContentConfig类的方法名称为content。要确保您将属性绑定到正确的接口,当您为此类定义配置属性时,请使用前缀中的内容。这样,您还可以防止属性名称冲突和意外的应用程序行为。在
application.properties文件中定义greeting.content.prize-amount和greeting.content.recipients配置属性。以下示例显示了为
GreetingConfiguration实例和ContentConfig类定义的属性:application.properties文件示例greeting.message = hello greeting.name = quarkus greeting.content.prize-amount=10 greeting.content.recipients=Jane,John使用
@Inject注释,将GreetingConfiguration实例注入GreetingResource类,而不是三个@ConfigProperty字段注释,如下例所示。另外,您必须更新/greeting端点返回的消息字符串,并带有您为新的greeting.content.prize-amount和greeting.content.recipients属性设置的值。GreetingResource.java文件示例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 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(); } }以开发模式编译并启动应用程序:
./mvnw quarkus:dev重要如果没有为类属性提供值,应用程序将无法编译,您会收到一个
jakarta.enterprise.inject.spi.DeploymentException异常来指示缺少值。这不适用于带有默认值的Optional 字段和字段。要验证端点是否返回信息,请打开一个新的终端窗口并输入以下命令:
curl http://localhost:8080/greeting这时将显示一条消息,其中包含两行输出。第一行显示问候语,第二行报告 prize 收件人以及奖品量,如下所示:
hello quarkus! Jane,John receive total of candies: 10- 要停止应用程序,请按 Ctrl+C。
您可以注解带有 @ConfigMapping 的 Bean Validation 注解的类,如下例所示:
@ConfigMapping(prefix = "greeting")
public class GreetingConfiguration {
@Size(min = 20)
public String message;
public String suffix = "!";
}
您的项目必须包含 quarkus-hibernate-validator 依赖项。