【问题标题】:Set a constant of string in Dozer using custom converter使用自定义转换器在 Dozer 中设置字符串常量
【发布时间】: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 Bbranch 字段应始终等于 "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 ABean B 类来自第三方库,我无法更改它们。当然,可以使用 setter 方法手动设置值,但我的目标是在 Dozer 下整合所有与映射相关的工作。我的用例其实比较复杂,只是影响bean中字段的数量,不改变主旨。
  • 我以前做过类似的事情,通过使参数成为我想在目标字段上设置的值,使我的 CustomConverter 更加通用和可重用。您仍然可以对任何一对字段使用它,但至少它是一个可重用的自定义转换器,以防您遇到类似这样的另一种情况。
  • @JohnCamerin 感谢您的提示,因为我有很多这样的字段,所以它对我很有用。

标签: java mapping dozer


【解决方案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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2011-11-27
    • 1970-01-01
    • 2013-12-07
    • 2011-01-08
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多