首页 > 解决方案 > 使用 Spring 组件的内部组件属性

问题描述

我有一个组件,其成员是从 YAML 文件中填充的。我有这个组件的内部组件,它也有一些从 YAML 填充的成员。

但是当我启动应用程序时,尽管创建了实例,但内部组件的成员并未填充。主要组件成员加载正常。

需要知道为什么没有从 YAML 加载 Department 组件的成员。

更新

我可以看到该内部类加载了成员,但这是在应用程序加载期间稍后完成的,但该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

标签: javaspringspring-boot

解决方案


假设我们有以下财产持有者 dto 的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();
    }
}

Using@JsonProperty不适用于此类属性,因为该注释仅适用于通过 Jackson 进行的反序列化。@ConfigurationProperties专注于基本的 getter/setter,只需添加具有这些名称的 setter 就足够了,例如setDept1setDept2

在此处阅读有关 Spring Boot 上的外部化配置的更多信息


推荐阅读