簡體   English   中英

Dozer:沒有默認構造函數的類映射

[英]Dozer: Mapping of class with no default constructor

讓我們說我想映射以下兩個類:

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類的默認構造函數,我收到錯誤。

解決這個問題的最佳方法是什么? 使用自定義轉換器?

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

來自Dozer FAQ

我的一些數據對象沒有公共構造函數。 Dozer是否支持此用例?

是。 如果未找到公共no-arg構造函數,則在創建目標對象的新實例時,Dozer將自動檢測私有構造函數並使用它。 如果數據對象沒有私有構造函數,則可以指定自定義BeanFactory以創建目標對象的新實例。

這是Custom Bean Factories的文檔

我在嘗試映射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映射的類中。 我的推土機知識有點受限,所以我無法解釋它如何在引擎蓋下工作的深入細節,但它適用於我的項目。

您可以為B創建默認構造函數,也可以使用自定義BeanFactory ,以便Dozer可以創建所需的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM