java - 使用 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
解决方案
假设我们有以下财产持有者 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 就足够了,例如setDept1
等setDept2
。
在此处阅读有关 Spring Boot 上的外部化配置的更多信息
推荐阅读
- postgresql - 如何连接到 GitHub Action 的作业服务?
- ios - 带有-webkit-overflow-scrolling的可滚动Div:iFrame内的触摸在iOS 10移动Safari中不起作用
- php - 如何正确(独立)包含文件
- angular - Angular PWA:未检测到匹配的服务工作者
- angular - 如何修复 angular-cli 中的原理图问题/无法创建新的 Angular 应用程序
- xml - 如何将xml文本作为简单文本
- laravel - Laravel 在哪里没有得到任何结果?
- angular - Angular - 带有样式的 InnerHtml
- python - ttk.Entry:如果文本右对齐,则看不到插入符号
- node.js - 反对 js:无法使用连接表额外属性更新多对多关系。说附加属性无效