У меня есть проблема, которую я настраиваю с помощью @ConfigurationProperties, когда эта конфигурация изменяется, объект конфигурации не изменяется. Конфиг есть список. если добавить конфигурацию, список изменится, но если удалить конфигурацию, список не изменится.
@ConfigurationProperties(prefix = "zzzz.kafka")
public class ToadDynamicProps {
private List<String> bootstrapServers;
public ToadDynamicProps() {
System.out.println(bootstrapServers + " ===============");
}
public List<String> getBootstrapServers() {
return bootstrapServers;
}
public void setBootstrapServers(List<String> bootstrapServers) {
this.bootstrapServers = bootstrapServers;
}
}
И я сам реализую слушателя так:
@Override
public void onConfigChange(Map<String, String> properties) {
if (log.isDebugEnabled()) {
log.debug("ToadContextRefresher invoked, changed keys: {}", properties.keySet());
}
// update environment
MutablePropertySources targetSources = context.getEnvironment().getPropertySources();
CompositePropertySource compositeSource = (CompositePropertySource) targetSources.get(BOOTSTRAP_PROPERTY_SOURCE_NAME);
CompositePropertySource newBootstrapSource = new CompositePropertySource(BOOTSTRAP_PROPERTY_SOURCE_NAME);
//TODO fix
if(null == compositeSource) {
return ;
}
// shallow copy for non-toad propertySource, swap toad propertySource
for (PropertySource part : compositeSource.getPropertySources()) {
if (Objects.equals(part.getName(), TOAD_PROPERTY_KEY)) {
log.debug("Found toad property source in environment, update it...");
Map<String, Object> oldProperties = ((MapPropertySource) part).getSource();
Map<String, Object> newProperties = new HashMap<>(oldProperties);
newProperties.putAll(properties);
MapPropertySource newToadSource = new MapPropertySource(TOAD_PROPERTY_KEY, newProperties);
newBootstrapSource.addPropertySource(newToadSource);
}
newBootstrapSource.addPropertySource(part);
}
targetSources.replace(BOOTSTRAP_PROPERTY_SOURCE_NAME, newBootstrapSource);
Set<String> changedKeys = properties.keySet();
this.context.publishEvent(new EnvironmentChangeEvent(context, changedKeys));
this.scope.refreshAll();
}