gpt4 book ai didi

java - 使用 Spring 组件内部组件的属性

转载 作者:行者123 更新时间:2023-12-02 09:43:01 25 4
gpt4 key购买 nike

我有一个组件,其成员是从 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

最佳答案

假设我们有以下属性(property)持有人 dto 的 CompanyDepartment

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

了解有关 Spring Boot 外部化配置的更多信息,here

关于java - 使用 Spring 组件内部组件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56907343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com