我想使用带有自定义ConversionService
实现的Spring Converter
来转换Spring XML配置中的值。
我通过xml配置配置bean,如下所示:
<bean name="A1" class="com.example.MyClass">
<constructor-arg name="time" value="10"/>
</bean>
相关课程:
import java.time.Duration;
public class MyClass {
public MyClass(Duration time) {
System.out.println("TIME: " + time);
}
}
应执行转换的转换器是:
public class StringToDurationInSecondsConverter implements Converter<String, Duration> {
@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:创建名称为&#39; A1&#39;的bean时出错在通过SAX InputSource加载的资源中定义:通过构造函数参数0表示的不满意依赖:无法将类型[java.lang.String]的参数值转换为必需类型[java.time.Duration]:无法转换类型&#39的值; java.lang.String中&#39;要求的类型&#39; java.time.Duration&#39 ;;嵌套异常是java.lang.IllegalStateException:无法转换类型&#39; java.lang.String&#39;的值到必需的类型&#39; java.time.Duration&#39;:找不到匹配的编辑器或转换策略
如果我在我的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配置,但还有一些&#34; volatile&#34;另一个bean从文件读取的配置(除了转换之外还有效)。
是否可以使用Spring的自定义Converter
的ConversionService来转换Spring xml配置中的值?怎么样?
答案 0 :(得分:0)
感谢comment Sotirios Delimanolis(在另一个问题上),我提出了以下解决方案:
@Bean
public ConversionService conversionService(Set<Converter<?, ?>> converters) {
final ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();
factory.setConverters(converters);
factory.afterPropertiesSet(); // necessary
return factory.getObject();
}
从XML转换属性值现在可以正常工作。