当前位置: 首页 > 知识库问答 >
问题:

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

罗昊明
2023-03-14

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

<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:在通过SAX inputsource加载的资源中创建名为“A1”的bean时出错:未满足的依赖关系通过构造函数参数0表示:无法将类型[java.lang.string]的参数值转换为必需的类型[java.time.duration]:无法将类型'java.lang.string'的值转换为必需的类型'java.time.duration';嵌套异常是java.lang.IllegalStateException:无法将类型“java.lang.String”的值转换为所需类型“java.time.Duration”:找不到匹配的编辑器或转换策略

如果将断点设置到convert方法中,则永远无法到达断点。所以看起来转换器从来没有被调用过。

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

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

...我得到了一个例外:

共有1个答案

祖浩淼
2023-03-14

由于Sotirios Delimanolis(关于另一个问题)的评论,我得出了以下解决方案:

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

从XML转换属性值现在工作得很好。

 类似资料:
  • 我正在尝试使用DozerJava API使用自定义转换器映射两个Java类。有没有办法在Java中配置类级自定义转换器?现在,我必须在XML中添加配置: 感谢您的帮助!

  • 主要内容:JSF自定义转换器实例我们可以在JSF中创建自己的自定义转换器。 以下列表是我们可以在JSF中创建自定义转换器的步骤。 通过实现接口创建一个转换器类。 实现上述接口的和方法。 使用注解为自定义转换器分配唯一的ID。 JSF自定义转换器实例 打开 NetBeans IDE 创建一个Web工程:CustomConverter,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文

  • I'v开始寻找很好的解决方案,如何使用Spring CassandraOperations很好地持久化实体。问题的出现是因为我的实体中的某些字段不支持cassandra,例如joda DateTime。 解决方法是在java类型的同一实体中有其他字段。util。Date而不是joda DateTime,用@Transient标记未要求的字段。但这并不干净,所以我开始寻找自动自定义转换。 目前,sp

  • 这是我的字符串格式的肥皂xml,我需要如何在Farm对象中形成它。Farm是我的自定义类,任何库都是现成的 使用此代码后,我得到了异常 意外元素(uri:“http://yyyyyy . yyyyy * * * * * * * *”,local:“farm”)。预期的元素有

  • XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输

  • 我为jsf创建了一个自定义转换器。getAsObject()工作正常,但getAsString()返回异常。我不确定问题出在哪里,我尝试过用不同的方式将对象转换为字符串,但它不断返回异常。 这是我的代码: 这是Product类(为简单起见排除了getter/Setters/equals()/hash()): 这是stack我得到的: 这是我使用转换器的jsf: