Настройте список компонентов с другой конфигурацией

#java #spring #spring-boot #configuration

#java #весна #пружинный ботинок #конфигурация

Вопрос:

У меня есть приложение для очистки данных Spring Boot, которое мы используем для многих разных компаний. Я создал библиотеку модулей очистки, которые наша команда может настроить по мере необходимости для конкретного клиента. Я хочу расширить то, что я построил, и я просто не могу заставить это работать.

Подводя итог проблеме, я думаю, что я пытаюсь создать список компонентов, каждый из которых настроен по-разному, где может быть несколько экземпляров одного и того же класса.

Вот пример желаемой конфигурации (с использованием application.yml):

 app.dataEnrichmentSteps:
  - name: Module1 #used to derive name of the Class that has the functionality
    filters:
      - name: FieldIsNotBlank #used to derive name of "filter" classname
        field: someRecordFieldName
      - name: FieldIsBlank
        field: someOtherRecordFieldName
    config:
      mod1cfg-a: someVal
      mod1cfg-b: someVal
  - name: Module2
    filters:
      - name: FieldIsNotBlank #used to derive name of "filter" classname
        field: someRecordFieldName
    config:
      mod2cfg-a: someVal
      mod2cfg-b: someVal
  - name: Module1 #this instance of Module1 has different config, and needs to run after the previous 2
    config:
      mod1cfg-a: someOtherVal
      mod2cfg-b: someOtherValAgain
  - name: Module3
    config:
      mod3cfg-a: hopefully you get the point
 

Приложение должно быть достаточно гибким, чтобы использовать любой модуль в любом порядке и любое количество раз. В настоящее время при запуске приложения у меня есть a @Bean , который выполняет шаги и создает экземпляры служб (на основе имени) и передает в конфигурацию. Вот класс конфигурации, который Spring заполняет для меня (который мне не нравится, но это все, что я мог заставить работать):

 @Data
@Component
@ConfigurationProperties(prefix="app")
public class ModuleConfig {
    private List<EnrichmentConfig> dataEnrichmentSteps;

    @Data
    public static class EnrichmentConfig{
        //what kind of Enrichment are we doing?
        private String name;

        //how is the enrichment service configured?
        private HashMap<String, String> config; 

        //on which fields should the enrichment execute on?
        private List<HashMap<String,String>> filters; 
    }
}
 

Я борюсь с динамическим характером этой конфигурации. В идеале, мне бы очень понравилось, если бы каждый модуль мог определять POJO для своей конфигурации вместо того, чтобы я работал с Картами, но все, с чем я сталкиваюсь, предполагает фиксированную структуру конфигурации, а не то, что, по моему мнению, должно быть гибким.

Я знаком с @JsonTypeInfo и @JsonSubTypes при работе с Jackson и с полезной нагрузкой JSON, которая может иметь немного динамически структурированного JSON, хотя, похоже, я не могу понять, как сделать что-то подобное для конфигурации Spring.

Комментарии:

1. вероятно, здесь есть хороший вопрос, но я прочитал это 3 раза и пока не могу понять: (есть ли способ упростить это?

2. Спасибо за отзыв. Я пересмотрел вопрос, надеясь упростить сценарий.

3. Я не совсем уверен, но похоже, что вы пытаетесь сделать что-то вроде @ConditionalOnClass , но немного более сложное.

4. Я пытаюсь создать «конвейер» из шагов, которые полностью зависят от конфигурации. У меня есть 5 различных модулей, которые довольно универсальны и могут быть повторно использованы несколько раз в одном конвейере.

5. Что это позволяет мне сделать, так это создать список <Обогащение> (где Обогащение — это интерфейс), который содержит 1 ..N различных объектов, которые вызываются последовательно. Список может состоять из экземпляров разных классов или нескольких экземпляров одного и того же класса. Важно то, что каждый объект будет иметь разную конфигурацию.