java - quarkus/microprofile 中的组配置

标签 java quarkus microprofile

我想在 Quarkus 中对配置项进行分组,并将它们用作 Map。类似于下一个 application.properties 的内容:

greeting.names = tom,jane
greeting.tom.message = hello
greeting.tom.name = tom
greeting.jane.message = hi
greeting.jane.name = jane

并将它们放在应用程序的 Map 中,如下所示:

@ConfigProperties
public class GreetingConfig {

   private String name;
   private String message;

   // getters / setters
}

像这样使用它们:

private Map<String, GreetingConfig> config;

它们现在已按名称索引,但 List 也可以(这是我实际需要的):

greeting.1.message = hello
greeting.1.name = tom
greeting.2.message = hi
greeting.2.name = jane

关于如何实现这一点有什么想法吗?我有一个编程解决方案,但更喜欢仅通过注释的解决方案

最佳答案

我这几天也遇到了类似的问题。 所以我编写了一个简单的 Quarkus 扩展来帮助我进行配置。 您可以使用 Quarkus 站点中的指南:Quarkus - Writing Your Own ExtensionQuarkus - Building my first extension , 但基本上这些是创建配置所采取的步骤:

  1. 有一些 maven 多模块项目(不是将使用配置的项目)。
  2. 从项目目录执行类似的命令:
mvn io.quarkus:quarkus-maven-plugin:1.4.2.Final:create-extension -N \
    -Dquarkus.artifactIdBase=keycloak-extension \
    -Dquarkus.artifactIdPrefix=otaibe-commons-quarkus- \
    -Dquarkus.nameBase="Keycloak extension"

这将使用以下模块创建“子多模块”项目:runtumedeployment

  • 转到runtime模块并添加并注释您的配置类。它应该类似于 this class
  • runtime模块中创建一个producer应该将配置类注册为 CDI bean 的类:
  • @ApplicationScoped
    public class OtaibeKeycloakQuarkusProducer {
    
        private volatile OtaibeKeycloakConfig otaibeKeycloakConfig;
    
        void initialize(OtaibeKeycloakConfig config) {
            this.otaibeKeycloakConfig = config;
        }
    
        @Singleton
        @Produces
        public OtaibeKeycloakConfig otaibeKeycloakConfig() {
            return otaibeKeycloakConfig;
        }
    
    }
    
  • 创建 Recorder应该初始化Producer的类:
  • @Recorder
    public class OtaibeKeycloakRecorder {
    
        public void initOtaQuarkusProducer(BeanContainer container, OtaibeKeycloakConfig configuration) {
            OtaibeKeycloakQuarkusProducer producer = container.instance(OtaibeKeycloakQuarkusProducer.class);
            producer.initialize(configuration);
        }
    
    }
    
  • deployment模块中,您有一个Processor类。转到那里并注册您的 Producer 以作为 CDI bean 进行注入(inject),并注册您的 Recorder 来初始化它。添加类似的代码:
  •     @BuildStep
        AdditionalBeanBuildItem beans() {
            return AdditionalBeanBuildItem.builder().addBeanClasses(OtaibeKeycloakQuarkusProducer.class).build();
        }
    
        @BuildStep
        @Record(ExecutionTime.RUNTIME_INIT)
        void otaibeKeycloackConfigBuildItem(BeanContainerBuildItem beanContainer,
                                            OtaibeKeycloakConfig otaibeKeycloakConfig,
                                            OtaibeKeycloakRecorder recorder) {
            recorder.initOtaQuarkusProducer(beanContainer.getValue(), otaibeKeycloakConfig);
        }
    

    你可以找到我的实现here .

  • 现在,转到将使用配置的初始项目,并将 runtime 模块添加为依赖项。

  • 为了确保正确添加配置,请执行以下 maven 命令:

  • mvn quarkus:generate-config
    

    现在,您可以检查文件 src/main/resources/application.properties.example 并验证您的属性是否已添加到其中。属性组应以 quarkus. 开头加上您的 @ConfigRoot 注释的名称。以我为例,它将以 quarkus.otaibe.keycloak

    开头

    就是这样!

    关于java - quarkus/microprofile 中的组配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121262/

    相关文章:

    java - Quarkus、Hibernate ORM 和 REST - RESTEASY008200 : JSON Binding deserialization error:

    java - AspectJ - 来自外部 JAR 的方面

    Java Microprofile 更改已部署应用程序的属性 (Wildfly)

    websphere-liberty - 使用 microprofile-config-api : WELD-001408: Unsatisfied dependencies for type String with qualifiers @ConfigProperty

    java - Runtime.getRuntime().exec( ... ) 在 Java 8 + NetBeans 下运行 javac、javah 但不运行 java :

    java - 从 Java 发布到 SharePoint 2013

    当节点没有父级时,JavaFX CSS 类不会被删除

    java - 如果 .properties 文件位于不同位置,如何访问 ant 中的文件

    java - 如何在Fabric8 Open Jdk Container中启用扩展编码?

    java - 属性 quarkus.http.ssl.certificate.key-store-file 无法正常工作,无法找到请求目标的有效证书路径