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

Java Dozer:没有默认构造函数的类映射,java,dozer,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 =

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

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
缺少默认构造函数

解决这个问题的最好办法是什么? 使用推土机上的自定义转换器?

我的一些数据对象没有公共构造函数。推土机是否支持此用例? 对。在创建目标对象的新实例时,如果未找到公共无参数构造函数,Dozer将自动检测私有构造函数并使用该构造函数。如果数据对象没有私有构造函数,您可以指定自定义BeanFactory来创建目标对象的新实例


以下是的文档,如果B类不是您的API,并且您对它没有控制权,并且您打算映射成员属性,那么您可以使用自定义bean工厂,该工厂可能会将默认值传递给构造函数:

<mapping>
  <class-a>com.example.A</class-a>
  <class-b bean-factory="com.example.factories.BFactory">
    com.example.B
  </class-b>
</mapping>

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

我在尝试映射a
java.util.Locale
时遇到了这个问题。为了解决我的问题,我做了如下工作:

我创建了一个名为LocaleMapper的类,该类将匹配dumb 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;
    }
}
公共类LocaleMapper扩展DozerConverter{
公共LocaleMapper(){
super(Locale.class,Locale.class);
}
@凌驾
公共区域设置转换为(区域设置localeA,区域设置localeB){
返回localeA;
}
@凌驾
公共语言环境转换源(语言环境localeA,语言环境localeB){
返回localeA;
}
}
然后我修改了项目的映射xml:

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

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

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