【发布时间】:2019-05-14 07:46:22
【问题描述】:
我一直在寻找在 Dozer 映射中设置常量值的解决方案,并且在 stackoverflow 上阅读了很多关于这个问题的答案。所以我决定使用推土机自定义转换器。
让我澄清一下我的情况。
我有两个具有以下字段的 bean:
豆A:
String name;
String phone;
String bankId;
豆 B:
String branch;
String phone;
String name;
String bankId;
Bean B 的 branch 字段应始终等于 "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 值设置为"1111"。但是这种方法看起来很糟糕:
<!-- Can use any existing field of String here, since there is a custom converter -->
<a>name</a>
<b>branch</b>
我必须在 XML 映射中设置一个 name 字段作为源,以便启动我的自定义转换器,因为即使源字段实际上并不需要,Dozer 也需要源字段和目标字段。通常,它使我的代码不清楚且难以维护。
我想我做错了,或者以不恰当的方式使用了这种方法。有人可以解释一下这个问题吗?
我使用推土机 5.5.1
【问题讨论】:
-
如果 branch 的值应该始终为 1111,为什么不在 Bean B 类中将该字段初始化为该值?我怀疑您的用例比这里介绍的更复杂。您能否稍微扩展一下这个问题,以便我们找到更有意义的解决方案?
-
嗨@JohnCamerin,感谢您的回复,您已经明白了我的想法,在构造函数中将值分配给“1111”显然是最好的方法。但是
Bean A和Bean B类来自第三方库,我无法更改它们。当然,可以使用 setter 方法手动设置值,但我的目标是在 Dozer 下整合所有与映射相关的工作。我的用例其实比较复杂,只是影响bean中字段的数量,不改变主旨。 -
我以前做过类似的事情,通过使参数成为我想在目标字段上设置的值,使我的 CustomConverter 更加通用和可重用。您仍然可以对任何一对字段使用它,但至少它是一个可重用的自定义转换器,以防您遇到类似这样的另一种情况。
-
@JohnCamerin 感谢您的提示,因为我有很多这样的字段,所以它对我很有用。