#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 различных объектов, которые вызываются последовательно. Список может состоять из экземпляров разных классов или нескольких экземпляров одного и того же класса. Важно то, что каждый объект будет иметь разную конфигурацию.