我一直在寻找一种在Dozer映射中设置恒定值的解决方案,并在stackoverflow上阅读了有关此问题的很多答案。因此,我决定使用推土机自定义转换器。
让我澄清一下情况。
我有两个具有以下字段的bean:
Bean A:
a = {}
local foo = table.remove(tab, 1)
if type(foo) ~= "nil" then table.insert(a, foo) end -- From tab into a
...
local bar = table.remove(a, 1)
if type(bar) ~= "nil" then table.insert(tab, bar) end -- From a into tab
Bean B:
android:clickable="true"
String name;
String phone;
String bankId;
的{{1}}字段应始终等于String branch;
String phone;
String name;
String bankId;
。
所以我创建了一个自定义转换器:
branch
以及以下映射:
Bean B
效果很好,并将"1111"
的值设置为public class ConstantToTypeConverter extends DozerConverter<String, String> {
public ConstantToTypeConverter() {
super(String.class, String.class);
}
@Override
public String convertTo(String source, String destination) {
if (getParameter().equalsIgnoreCase("TYPE")) {
return "1111";
}
return null;
}
@Override
public String convertFrom(String source, String destination) {
return convertTo(source, destination);
}
}
。但是这种方法看起来很糟糕:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping type="one-way" map-id="map-test">
<class-a>BeanA</class-a>
<class-b>BeanB</class-b>
<field custom-converter="ConstantToTypeConverter"
custom-converter-param="TYPE">
<!-- Can use any existing field of String here, since there is a custom converter -->
<a>name</a>
<b>branch</b>
</field>
</mapping>
</mappings>
我不得不设置branch
字段作为XML映射中的源,只是为了启动我的自定义转换器,因为Dozer同时需要源字段和目标字段,即使实际上不需要源字段也是如此。通常,这会使我的代码不清楚并且难以维护。
我想我做错了或以不适当的方式使用了这种方法。有人可以说明这个问题吗?
我使用推土机5.5.1
答案 0 :(得分:1)
CustomConverter之外的另一个选项是创建一个BeanFactory
来初始化bean。
public class BeanBFactory implements org.dozer.BeanFactory {
@Override
public Object createBean(Object source, Class<?> sourceClass, String targetBeanId) {
return new BeanB(Constants.X, Constants.Y, ...);
}
}
<mapping>
<class-a>BeanA</class-a>
<class-b bean-factory="BeanBFactory">
BeanB
</class-b>
</mapping>
您不应该计算代码行;它可能比硬编码转换要长(至少对于简单的bean)。