Расслабленное связывание не работает для составных имен @ConfigurationProperties с источником свойств пользовательской среды системы - PullRequest
0 голосов
/ 14 января 2020

У меня есть внешний источник свойств (скажем, файл .properties) с переменными среды, такими как:

MY_PROP1=1A
MY_PROPS_PROP1=1B
MY_PROPOBJ_PROP1=1C

И я хочу инициировать @ConfigurationProperties с такими:

@ConfigurationProperties("my")
@Setter
@Getter
class MyProperties {

    private String prop1;
    private Props props = new Props();
    private PropsObj propsObj = new PropsObj();

    @Setter
    @Getter
    class Props {
        private String prop1;
    }

    @Setter
    @Getter
    class PropsObj {
        private String prop1;
    }
}

Все работает нормально, когда я устанавливаю их в качестве переменных среды при запуске приложения. Но когда я обрабатываю их с пользовательским SystemEnvironmentPropertySource в EnvironmentPostProcessor, свойство prop1 составного объекта propsObj не разрешается (значение null):

class MyEnvPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {
        env.getPropertySources().addLast(
            new SystemEnvironmentPropertySource(
                "myPropertySource1",
                // simplified, the map will be filled from a properties file etc:
                Map.of("MY_PROP1", "1A", "MY_PROPS_PROP1", "1B", "MY_PROPOBJ_PROP1", "1C")));
    }
}

Почему расслабленное связывание не работает в этом случае?

Я использую Spring Boot 2.2.2.RELEASE

1 Ответ

1 голос
/ 14 января 2020

Проблема в отображении, используемом Spring для разрешения имен свойств. Для переменных среды необходимо использовать SystemEnvironmentPropertyMapper, чтобы работать как положено.

Этот преобразователь сопоставляет имя свойства с возможными кандидатами: MY_PROPOBJ_PROP1, MY_PROP_OBJ_PROP1, my.prop-obj.prop1, тогда как сопоставитель по умолчанию дает только my.prop-obj.prop1. Так как my.prop-obj.prop1 не может быть найден в вашем источнике пользовательских свойств, значение не разрешено.

Чтобы подсказывать Springу использовать правильный сопоставитель для свойств среды, имя источника вашего свойства должно заканчиваться -systemEnvironment, соответственно с StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME. Измените свой код следующим образом:

environment.getPropertySources().addAfter(
    StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
    new SystemEnvironmentPropertySource(
        "myPropertySource-" + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
        Map.of("MY_PROPOBJ_PROP1", "MyValue1")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...