10

次の2つのクラスをマップしたいとしましょう:

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 );class のデフォルト コンストラクターがないため、エラーが発生しますB

その問題を解決する最善の方法は何ですか? カスタム コンバーターを使用しますか?

4

4 に答える 4

9

クラス 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>

あなたの工場はorg.dozer.BeanFactoryインターフェースを実装します:

public interface BeanFactory {
  public Object createBean(Object source, Class sourceClass, String targetBeanId);
}
于 2011-11-15T09:00:52.077 に答える
4

Dozer FAQから:

一部のデータ オブジェクトにはパブリック コンストラクターがありません。Dozer はこのユースケースをサポートしていますか?

はい。public no-arg コンストラクターが見つからない場合に宛先オブジェクトの新しいインスタンスを作成すると、Dozer はプライベート コンストラクターを自動検出し、それを使用します。データ オブジェクトにプライベート コンストラクターがない場合は、カスタム BeanFactory を指定して、宛先オブジェクトの新しいインスタンスを作成できます。

これは、カスタム Bean ファクトリのドキュメントです。

于 2011-11-15T08:57:59.207 に答える
3

をマッピングしようとしているときに、この問題に遭遇しましたjava.util.Locale。私の問題を解決するために、次のようにしました:

愚かな LocaleToLocaleConversion に一致する LocaleMapper というクラスを作成しました

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>

これで、Dozer にマップされたクラスに Locale オブジェクトを追加できるようになりました。私の Dozer に関する知識は限られているため、ボンネットの下でどのように機能するかを詳しく説明することはできませんが、私のプロジェクトではうまくいきました。

于 2013-05-14T18:44:39.763 に答える
0

B のデフォルトのコンストラクターを作成するか、代わりにカスタム BeanFactoryを使用して、Dozer が必要なインスタンスを作成できるようにすることができます。

于 2011-11-15T09:03:24.517 に答える