Свойства конфигурации для карты - PullRequest
0 голосов
/ 24 августа 2018

В моем файле yaml для весенней загрузки есть следующая структура:

countryConfiguration:
  NL:
    address:
      postcodeKeyboardType: ALPHANUMERIC
      postcodeExample: 1111 AA
      cityExample: Amsterdam
  ES:
    address:
      postcodeKeyboardType: NUMERIC
      postcodeExample: 11111
      cityExample: Madrid

И я хочу создать класс свойств конфигурации для доступа к этим значениям.У меня есть что-то вроде этого:

@Configuration
@ConfigurationProperties
@Validated
public class CountryConfigurationProperties {

    @NotNull
    private Map<String, Configuration> countryConfiguration;

    public Map<String, Configuration> getCountryConfiguration() {
        return countryConfiguration;
    }

    public void setCountryConfiguration(Map<String, Configuration> 
countryConfiguration) {
        this.countryConfiguration = countryConfiguration;
    }

    public static class Configuration {
        private Object address;

        public Object getAddress() {
            return address;
        }

        public void setAddress(Object address) {
            this.address = address;
        }
    }


}

Но это не работает, я получаю это: Привязка к цели org.springframework.boot.context.properties.bind.BindException: Не удалось связать свойства в '' toio.bux.onboarding.application.config.CountryConfigurationProperties $$ EnhancerBySpringCGLIB $$ 1d9a5856 не удалось:

Property: .countryConfiguration
Value: null
Reason: must not be null

Если я удаляю статический внутренний класс Configuration и помещаю Object, он работает ...

1 Ответ

0 голосов
/ 24 августа 2018

Я заметил, что поле адреса имеет тип Object. Я ожидал бы, что это будет иметь тип Address, и для этого будет внутренний класс, который представляет объект Address.

В приведенном ниже фрагменте кода я добавил класс Address для соответствия используемой вами конфигурации yml. Я проверил это, и он успешно запускается и сопоставляет свойства соответственно.

@Validated
@Component
@ConfigurationProperties
public class CountryConfigurationProperties {

    @NotNull
    private Map<String, Configuration> countryConfiguration;

    public Map<String, Configuration> getCountryConfiguration() {
        return countryConfiguration;
    }

    public void setCountryConfiguration(Map<String, Configuration> countryConfiguration) {
        this.countryConfiguration = countryConfiguration;
    }

    public static class Configuration {
        private Address address;

        public Address getAddress() {
            return address;
        }

        public void setAddress(Address address) {
            this.address = address;
        }
    }

    public static class Address {
        private String postcodeKeyboardType;
        private String postcodeExample;
        private String cityExample;

        public String getPostcodeKeyboardType() {
            return postcodeKeyboardType;
        }

        public void setPostcodeKeyboardType(String postcodeKeyboardType) {
            this.postcodeKeyboardType = postcodeKeyboardType;
        }

        public String getPostcodeExample() {
            return postcodeExample;
        }

        public void setPostcodeExample(String postcodeExample) {
            this.postcodeExample = postcodeExample;
        }

        public String getCityExample() {
            return cityExample;
        }

        public void setCityExample(String cityExample) {
            this.cityExample = cityExample;
        }
    }


}
...