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

时间:2017-09-22 09:21:07

标签: java xml spring type-conversion

我想使用带有自定义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配置中的值?怎么样?

1 个答案:

答案 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转换属性值现在可以正常工作。