如何在 Spring 中实现自定义转换器以从应用程序属性创建类?

问题描述 投票:0回答:1

我有一个 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 处理配置时执行的转换器?

java spring spring-boot config
1个回答
0
投票

希望你一切都好!

您是否从配置类创建了 Bean 以便在 spring 上下文中使用它?

    @Configuration
public class ConverterConfig {

    @Bean
    @ConfigurationPropertiesBinding
    public CustomFieldConverter customFieldConverter() {
        return new CustomFieldConverter();
    }
}

有必要让spring正确使用这个属性转换器,

真诚的

© www.soinside.com 2019 - 2024. All rights reserved.