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

时间:2011-11-15 08:52:05

标签: java dozer

让我们说我要映射以下两个类:

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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

来自Dozer FAQ

  

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

     

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

以下是Custom Bean Factories

的文档

答案 2 :(得分:2)

我在尝试映射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映射的类中。我的推土机知识有点受限,所以我无法解释它在底层工作的深入细节,但它适用于我的项目。

答案 3 :(得分:0)

您可以为B创建默认构造函数,也可以使用custom BeanFactory,以便Dozer可以创建所需的实例。