Используйте свойство для внутреннего компонента для компонента Spring - PullRequest
0 голосов
/ 05 июля 2019

У меня есть компоненты, члены которых заполняются из файла YAML.У меня есть внутренний компонент к этому компоненту, у которого также есть некоторые члены, заполненные из YAML.

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

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

обновление

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

Вот как определяется мой компонент

@Component
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
@ConfigurationProperties(prefix = "company")
public class Company {

    @JsonProperty("connectTimeout")
    private Integer connectTimeout;
    @JsonProperty("socketTimeout")
    private Integer socketTimeout;
    @JsonProperty("clientTimeout")
    private Integer clientTimeout;
    @JsonProperty("dept1")
    @Autowired
    private Department library;
    @JsonProperty("dept2")
    @Autowired
    private Department admin;
    @JsonProperty("dept3")
    @Autowired
    private Department transport;
    @JsonProperty("dept4")
    @Autowired
    private Department finance;

    //Getters and Setters

    @Component
    @SuppressWarnings({"PublicInnerClass", "WeakerAccess"})
    public static class Department {

        @JsonProperty("connectTimeout")
        private Integer connectTimeout;
        @JsonProperty("socketTimeout")
        private Integer socketTimeout;
        @JsonProperty("clientTimeout")
        private Integer clientTimeout;

        //Getters and Setters
    }
}

Ниже приведен мой YAML-файл

company:
  connectTimeout: 1000
  socketTimeout: 20000
  clientTimeout: 150
  dept1:
    connectTimeout: 100
    socketTimeout: 100
    clientTimeout: 100
  dept2:
    connectTimeout: 100
    socketTimeout: 100
    clientTimeout: 100
  dept3:
    connectTimeout: 100
    socketTimeout: 100
    clientTimeout: 100
  dept4:
    connectTimeout: 100
    socketTimeout: 100
    clientTimeout: 100

1 Ответ

1 голос
/ 10 июля 2019

Предположим, у нас есть следующий владелец свойства dto's Company & Department;

public class Company {

    private Integer connectTimeout;
    private Integer socketTimeout;
    private Integer clientTimeout;
    private Department library;
    private Department admin;
    private Department transport;
    private Department finance;

    public void setDept1(Department dept1) {
        this.library = dept1;
    }

    public void setDept2(Department dept2) {
        this.admin = dept2;
    }

    public void setDept3(Department dept3) {
        this.transport = dept3;
    }

    public void setDept4(Department dept4) {
        this.finance = dept4;
    }

    // other getter/setters

    public static class Department {

        private Integer connectTimeout;
        private Integer socketTimeout;
        private Integer clientTimeout;

        // getter/setters
    }
}

& просто определите свойство конфигурации, содержащее bean с;

@Configuration
public class MyConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "company")
    public Company company() {
        return new Company();
    }
}

Использование @JsonProperty не будет работать с такими свойствами, поскольку эта аннотация работает только с де / сериализацией через Джексона. @ConfigurationProperties фокусируется на основных методах получения / установки, достаточно просто добавить установщики с такими именами, например, setDept1, setDept2 и т. Д.

Подробнее о внешней конфигурации Spring Boot, здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...