如何使用自定义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转换属性值现在可以正常工作。