Dozer:没有默认构造函数的类的映射

10

假设我想要映射以下两个类:

public class A {

    String member;

    public void setMember(String member) { this.member = member }
    public String getMember() { return member }
}

public class B {

    String member;

    public B(String member) { this.member = member }

    public String getMember() { return member }
}

当我想让Dozer执行以下转换时:dozerBeanMapper.map(a, B.class);,我因为类B缺少默认构造函数而出现错误。

什么是解决该问题最好的方法?使用自定义转换器吗?

4个回答

9
如果B类不是您的API,您无法控制它,并且仍然打算映射成员属性,那么您可以使用自定义Bean工厂来解决问题,该工厂可以向构造函数传递默认值。请注意保留HTML标记。
<mapping>
  <class-a>com.example.A</class-a>
  <class-b bean-factory="com.example.factories.BFactory">
    com.example.B
  </class-b>
</mapping>

您的工厂将实现org.dozer.BeanFactory接口:

public interface BeanFactory {
  public Object createBean(Object source, Class sourceClass, String targetBeanId);
}

4

来自Dozer的常见问题解答:一些数据对象没有公共构造函数,Dozer支持这种情况吗?

一些我的数据对象没有公共构造函数,Dozer支持这种情况吗?

是的。当创建一个新的目标对象实例时,如果找不到公共无参构造函数,则Dozer将自动检测一个私有构造函数并使用它。如果数据对象没有私有构造函数,则您可以为创建目标对象的新实例指定自定义BeanFactory

这里是自定义Bean Factory的文档


3

在尝试映射java.util.Locale时,我遇到了这个问题。为了解决我的问题,我按照以下步骤进行:

我创建了一个名为LocaleMapper的类,它将匹配愚蠢的LocaleToLocaleConversion。

public class LocaleMapper extends DozerConverter<Locale, Locale> {
    public LocaleMapper() {
        super(Locale.class, Locale.class);
    }

    @Override
    public Locale convertTo(Locale localeA, Locale localeB) {
        return localeA;
    }

    @Override
    public Locale convertFrom(Locale localeA, Locale localeB) {
        return localeA;
    }
}

然后我修改了该项目的映射XML:

<converter type="LocaleMapper">
            <class-a>java.util.Locale</class-a>
            <class-b>java.util.Locale</class-b>
 </converter>

现在我可以向使用Dozer映射的类中添加Locale对象。我对Dozer的了解有限,无法深入解释其底层工作原理,但它在我的项目中可行。


0

您可以为 B 创建一个默认构造函数,或者使用自定义BeanFactory,以便Dozer可以创建所需的实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接