【问题标题】:Dozer: Mapping of class with no default constructor推土机:没有默认构造函数的类映射
【发布时间】:2011-11-15 08:52:05
【问题描述】:

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

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 的默认构造函数,我得到一个错误。

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

【问题讨论】:

    标签: java dozer


    【解决方案1】:

    如果 B 类不是您的 API,并且您无法控制它,并且您打算映射 member 属性,那么您可以使用自定义 bean factory或许可以将默认值传递给构造函数:

    <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);
    }
    

    【讨论】:

      【解决方案2】:

      来自推土机FAQ

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

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

      这是Custom Bean Factories的文档

      【讨论】:

        【解决方案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 映射的类中。我的推土机知识有些有限,所以我无法详细解释它是如何工作的,但它适用于我的项目。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-01
            • 2023-03-20
            相关资源
            最近更新 更多