让我们说我要映射以下两个类:
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
的默认构造函数,我收到错误。
解决这个问题的最佳方法是什么? 使用自定义转换器?
答案 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 来创建目标对象的新实例。
答案 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可以创建所需的实例。