quarkus / microprofile 中的组配置

Group configuration in 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 Extension and Quarkus - 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"

这将使用以下模块创建 'sub multi module' 项目:runtumedeployment

  1. 转到 runtime 模块并添加和注释您的配置 class。它应该类似于 this class
  2. runtime 模块中创建一个 producer class 应该将配置 class 注册为 CDI bean:
@ApplicationScoped
public class OtaibeKeycloakQuarkusProducer {

    private volatile OtaibeKeycloakConfig otaibeKeycloakConfig;

    void initialize(OtaibeKeycloakConfig config) {
        this.otaibeKeycloakConfig = config;
    }

    @Singleton
    @Produces
    public OtaibeKeycloakConfig otaibeKeycloakConfig() {
        return otaibeKeycloakConfig;
    }

}
  1. 创建一个 Recorder class 来初始化 Producer:
@Recorder
public class OtaibeKeycloakRecorder {

    public void initOtaQuarkusProducer(BeanContainer container, OtaibeKeycloakConfig configuration) {
        OtaibeKeycloakQuarkusProducer producer = container.instance(OtaibeKeycloakQuarkusProducer.class);
        producer.initialize(configuration);
    }

}
  1. deployment 模块中,您有一个 Processor class。去那里注册你的 Producer 可以作为 CDI bean 注入,然后你的 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

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

  2. 为了确保正确添加配置执行以下maven命令:

mvn quarkus:generate-config

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

开头

就是这样!