我使用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>
答案 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);