如何使用自定义Spring Converter转换XML配置值?

我想使用Spring ConversionService和自定义Converter实现来转换Spring XML配置中的值。

我通过xml配置配置bean,如下所示:

    

相关课程:

 import java.time.Duration; public class MyClass { public MyClass(Duration time) { System.out.println("TIME: " + time); } } 

应该执行转换的转换器是:

 public class StringToDurationInSecondsConverter implements Converter { @Override public Duration convert(String source) { int seconds = Integer.valueOf(source); return Duration.ofSeconds(seconds); } } 

配置如下所示:

 @SpringBootApplication public class Application { @Bean public ConversionService conversionService( Set<Converter> converters, ConversionServiceFactoryBean factory) { factory.setConverters(converters); return factory.getObject(); } @Bean public ConversionServiceFactoryBean conversionServiceFactoryBean() { return new ConversionServiceFactoryBean(); } @Bean public StringToDurationInSecondsConverter stringToDurationInSecondsConverter() { return new StringToDurationInSecondsConverter(); } // ... } 

转换器按预期注入到conversionService方法中,因此应正确初始化conversionService 。 但无法执行xml配置中参数time的转换。 错误消息是:

org.springframework.beans.factory.UnsatisfiedDependencyException:在通过SAX InputSource加载的资源中定义名称为’A1’的bean时出错:通过构造函数参数0表示的不满意依赖:无法将类型[java.lang.String]的参数值转换为必需type [java.time.Duration]:无法将类型’java.lang.String’的值转换为必需类型’java.time.Duration’; 嵌套exception是java.lang.IllegalStateException:无法将’java.lang.String’类型的值转换为必需类型’java.time.Duration’:找不到匹配的编辑器或转换策略

如果我在convert方法中设置断点,则永远不会到达。 所以看起来好像永远不会调用转换器。

即使我将ConversionService直接注入(修改的) MyClass并在构造函数中调用convert方法……

 public class MyClass { public MyClass(String time, ConversionService conversionService) { final Duration duration = conversionService.convert(time, Duration.class); System.out.println(duration); } } 

……我得到了例外:

ConverterNotFoundException:找不到能够从类型[java.lang.String]转换为类型[java.time.Duration]的转换器

应用程序的核心配置了Spring Java配置,但是有一些更“易变”的配置可以被另一个bean从文件中读取(除了转换之外还有什么用)。

是否可以使用Spring的ConversionService和自定义Converter来转换Spring xml配置中的值? 怎么样?

感谢Sotirios Delimanolis的评论 (在另一个问题上),我提出了以下解决方案:

 @Bean public ConversionService conversionService(Set> converters) { final ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean(); factory.setConverters(converters); factory.afterPropertiesSet(); // necessary return factory.getObject(); } 

从XML转换属性值现在可以正常工作。