Quarkus实战:专为Kubernetes而优化的Java解决方案
上QQ阅读APP看书,第一时间看更新

4.11 配置值的分组

问题

如何避免重复设置配置属性的通用前缀?

解决方案

可以使用@io.quarkus.arc.config.ConfigProperties注解来分组共同的属性(那些具有相同前缀的属性)。

当在你的应用程序中创建特别的配置属性时,通常这些属性会有相同的前缀(例如,greetings)。要注入这些属性值,可以使用@ConfigProperty注解(如4.1节所示),也可以使用io.quarkus.arc.config.ConfigProperties注解将属性分组。

使用application.properties文件:

让我们使用io.quarkus.arc.config.ConfigProperties注解实现一个将配置属性映射到Java对象的类。创建一个新的类org.acme.quickstart.GreetingConfiguration.java:

❶配置POJO的共同前缀

❷映射greeting.message属性

❸如果没有设置该属性,greeting.suffix的默认值

注意,prefix属性不是强制性的。如果它没有被设置,那么要使用的前缀将由类名来决定(去掉后缀部分Configuration),在这种情况下,前缀属性可以自动解析为greeting。

然后你可以注入这个配置POJO来使用配置值。

可以修改org.acme.quickstart.GreetingResource.java类来注入这个类:

❶用CDI @Inject注解注入配置

在终端窗口中请求/hello/configurations,可以看到配置值构成了输出结果,如下所示:

正如所见,你不需要通过使用@ConfigProperty来注解每一个field,只需要利用类定义来获取属性名或默认值。

讨论

此外,Quarkus支持嵌套的对象配置,因此你也可以通过使用内部类来映射。

假设我们在application.properties中添加一个名为greeting.output.recipients的新属性:

你可以使用一个内部类将其映射到配置对象中。修改类org.acme.quickstart.GreetingConfiguration.java,然后添加一个新的内部类,代表子类输出,并将其注册为一个field:

❶子类别的名称field名(output)

然后你可以访问greetingConfiguration.output.recipients来获取对应的值,也可以用Bean Validation来注解这些field,以便在启动时验证所有配置值是否有效。如果它们无效,应用程序将无法启动,并将在日志中显示错误信息。