如何在Dozer组件中的运行时提供自定义转换器参数?

时间:2015-10-13 01:29:48

标签: dozer converters

我使用Dozer字段级映射实现了带有静态自定义转换器参数的自定义转换器。但在我的情况下,自定义转换器参数将随时更改,我需要动态传递它们。

XML Field Level Dozer Mapping:

<field custom-converter-id="decoder" custom-converter-param='{"no":15,"name":"time","size":4,"covert":"test"}'>
        <a>data.message</a>
        <b>test[0].testField</b>
    </field>

1 个答案:

答案 0 :(得分:0)

如果您使用依赖注入框架,您可以将参数添加到某个bean并通过自定义转换器的编程查找获取此bean

你可以为源类创建一个包装器并将param传递给这个包装器(假设源类的类型为Source,目标是Destination):

public class DataWrapper {
    String param;
    Source wrapped;
    public DataWrapper(Source wrapped, String param) {
        this.wrapped = wrapped;
        this.param = param;
    }
    public String getParam() {
        return param;
    }
    public Source getWrapped() {
        return wrapped;
    }
}

然后你应该编写一个映射配置和自定义转换器,用于将DataWrapper类映射到你的Destination类:

    <custom-converters>
        <converter type="your converter">
            <class-a>DataWrapper</class-a>
            <class-b>Destination</class-b>
        </converter>
    </custom-converters>

此转换器将处理param并调用从Source类到Destination类的映射(映射配置也应该存在):

    public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass,
        Class<?> sourceClass) {
        DataWrapper wrapper = (DataWrapper) sourceFieldValue;
        String param = wrapper.getParam();
        ...
        return mapper.map(wrapper.getWrapped(), destinationClass);
    }

可以通过以下方式使用映射:

    DataWrapper wrapper = new DataWrapper(source, "no:15, name:time, size:4, covert:test");
    mapper.map(wrapper, Test.class);