Конфигурация группы в кваркусе / микропрофиле

Я хочу сгруппировать элементы конфигурации в 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

Есть идеи, как это реализовать? У меня есть программное решение, но я бы предпочел решение только по аннотации


person Sjaak    schedule 07.02.2020    source источник


Ответы (1)


У меня была похожая проблема в последнее время. Поэтому я написал простое расширение 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"

Это создаст там «вспомогательный мультимодульный» проект со следующими модулями: runtume и deployment.

  1. Перейдите в модуль runtime и добавьте и аннотируйте свой класс конфигурации. Это должно быть что-то похожее на этот класс
  2. В модуле runtime создайте _ 7_ класс, который должен зарегистрировать класс конфигурации как bean-компонент CDI:
@ApplicationScoped
public class OtaibeKeycloakQuarkusProducer {

    private volatile OtaibeKeycloakConfig otaibeKeycloakConfig;

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

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

}
  1. Создайте _ 9_, который должен инициализировать 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 для инъекции как bean-компонент CDI и свой 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

Вот и все!

person Triphon Penakov    schedule 08.05.2020