我有一个 Spring Boot 应用程序,我想在其中从配置属性创建类实例。
这些属性描述了对象可以具有的自定义(附加)字段。在此示例中是一个帐户。它允许该应用程序的用户定义对象具有哪些字段。
可以在 GitHub 上找到示例应用程序
配置如下:
spring:
application:
name: spring-config-converter
org.example:
account:
customFields:
booleanTest:
type: boolean
i18nKey: "org.example.customField.boolean"
stringTest:
type: string
i18nKey: "org.example.customField.string"
minLenght: 1
maxLenght: 3
numberTest:
type: number
i18nKey: "org.example.customField.number"
decimalDigits: 2
所有自定义字段始终具有参数
type
和 i18nKey
,其他字段取决于 type
参数的值。
我创建了一个反映这一点的类结构:
@Getter
@Setter
public class Account {
private Map<String, CustomField> customFields;
}
@Getter
@Setter
public class CustomField {
private String type;
private String i18nKey;
}
@Getter
@Setter
public class CustomFieldNumber extends CustomField{
private int decimalDigits;
}
@Getter
@Setter
public class CustomFieldString extends CustomField{
private int minLength;
private int maxLength;
}
接下来我创建了配置 bean:
@ConfigurationProperties("org.example")
@Getter
@Setter
public class CustomConfig {
private Account account;
}
最后我实现了一个转换器:
@Component
@ConfigurationPropertiesBinding
public class CustomFieldConverter implements Converter<Map<String, CustomField>, CustomField> {
@Override
public CustomField convert(Map<String, CustomField> source) {
// Here the logic to create the concrete instance based on the type would be implemented.
// But this method is not being called.
CustomField customField = new CustomField();
return customField;
}
}
问题是转换器从未被调用。 Spring 读取属性并将它们转换为
CustomField
的实例。这意味着对于 string
和 number
类型,缺少这些类型特有的字段。
当我将
Account
customFields
参数从 private Map<String, CustomField> customFields;
更改为 private Map<String, Map<String, Object>> customFields;
时,所有字段都会读入配置中。但在这种情况下,我没有 CustomField
类及其子类的类型安全。
所以问题是:如何更改应用程序启动且 Spring 处理配置时执行的转换器?
希望你一切都好!
您是否从配置类创建了 Bean 以便在 spring 上下文中使用它?
@Configuration
public class ConverterConfig {
@Bean
@ConfigurationPropertiesBinding
public CustomFieldConverter customFieldConverter() {
return new CustomFieldConverter();
}
}
有必要让spring正确使用这个属性转换器,
真诚的