使用自定义转换器在推土机中设置字符串常量

时间:2019-05-14 07:46:23

标签: java mapping dozer

我一直在寻找一种在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

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)。