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 );由于缺少 class 的默认构造函数,我得到一个错误B

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

4

4 回答 4

9

如果 B 类不是您的 API 并且您无法控制它并且您打算映射成员属性,您可以使用自定义 bean 工厂,它可能可以将默认值传递给 costructor:

<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);
}
于 2011-11-15T09:00:52.077 回答
4

来自推土机常见问题解答

我的一些数据对象没有公共构造函数。Dozer 是否支持此用例?

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

这是自定义 Bean 工厂的文档

于 2011-11-15T08:57:59.207 回答
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>

现在我可以将 Locale 对象添加到使用 Dozer 映射的类中。我的推土机知识有些有限,所以我无法解释它如何在引擎盖下工作的深入细节,但它对我的项目有用。

于 2013-05-14T18:44:39.763 回答
0

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

于 2011-11-15T09:03:24.517 回答