2

我想在 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;

它们现在已被名称索引,但 aList也可以(这也是我真正需要的):

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

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

4

1 回答 1

2

这些天我遇到了类似的问题。所以我写了一个简单的 Quarkus 扩展来帮助我进行配置。您可以使用 Quarkus 站点中的指南:Quarkus - 编写您自己的扩展Quarkus - 构建我的第一个扩展,但基本上这些是创建配置所采取的步骤:

  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.

  1. 转到runtime模块并添加并注释您的配置类。它应该类似于此类
  2. 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;
    }

}
  1. 创建一个Recorder应该初始化的类Producer
@Recorder
public class OtaibeKeycloakRecorder {

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

}
  1. deployment模块中,您有一个Processor类。去那里注册你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);
    }

你可以在这里找到我的实现。

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

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

mvn quarkus:generate-config

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

而已!

于 2020-05-08T06:32:38.457 回答