2

何百ものフィールドを持つ 2 つの非常によく似た JAXB オブジェクト グループがあります。唯一の違いは、これらのオブジェクトが異なるパッケージにあることです。そのため、コンパイラは別のクラスの値を設定できません。これがどのように見えるかです。

//employer sits in this package: com.beans.enrollment
      bodyResponse.setEmployer((com.beans.external.groupresponse.EmployerType)
sgCreateQuoteRequest.getRequest().getEmployer());

ここでコンパイルエラーが発生し、これらのフィールドを手動で取得/設定するには膨大な時間がかかります。

これらのオブジェクトをキャストする方法はありますか?

4

7 に答える 7

2

Dozer がこの問題に対する素晴らしい解決策であることは認めます。私はそれを試しました。そして、春に Bean を作成すると、次のようになります。

@Bean
  public Mapper getDozer(){
    return new DozerBeanMapper();
}

次に、マッパーを挿入し、オブジェクトを次のようにラップします。

private org.project.GetDocuments convertDocsInput(org.external.GetDocuments input) {
  return mapper.map(input, org.project.GetDocuments.class);
}
于 2016-07-05T21:20:48.853 に答える
1

JAXB API を使用してコピーを行うことができます。JAXBSource これには、ソース データをthenのインスタンスにラップすることが含まれます。これはUnmarshaller、 がSource単純に非整列化された から非整列JAXBSource化して、データを 2 番目のモデルにコピーできるためです。

デモコード

デモ

import javax.xml.bind.*;
import javax.xml.bind.util.JAXBSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create Input from Foo Model
        forum17791487.foo.Root fooRoot = new forum17791487.foo.Root();
        fooRoot.setValue("Hello World");
        JAXBContext fooContext = JAXBContext.newInstance(forum17791487.foo.Root.class);
        JAXBSource jaxbSource = new JAXBSource(fooContext, fooRoot);

        // Unmarshal Foo Input to Bar Model
        JAXBContext barContext = JAXBContext.newInstance(forum17791487.bar.Root.class);
        Unmarshaller unmarshaller = barContext.createUnmarshaller();
        forum17791487.bar.Root barRoot = (forum17791487.bar.Root) unmarshaller.unmarshal(jaxbSource);
        System.out.println(barRoot.getValue());
    }

}

出力

Hello World

ジャバモデル

次のクラスは、パッケージ名のみが異なります。この例ではパッケージごとに 1 つのクラスのみが使用されましたが、同じ原則がより大きなモデルにも適用されます。

forum17791487.foo.Root

package forum17791487.foo;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String foo) {
        this.value = foo;
    }

}

forum17791487.bar.Root

package forum17791487.bar;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String foo) {
        this.value = foo;
    }

}

詳細については

于 2013-07-23T13:19:52.127 に答える
0

Javaがその種の機能をサポートしているとは思わない.2つのオブジェクトをキャストするには、それらが同じ階層にある必要がある.

あなたのシナリオでは、 source から destination に値をマップするマッパーを書くことができますが、同じタイプの fields を含む Employer のような複数のクラスの場合、マッピング コードになる 2 つのアプローチを使用できます。

a)ドーザー マッピングを使用します。

b)またはコンパイル時にマッパーを生成します。これにより、ソースから宛先へ、またはその逆のマッピングが行われます。

注:私は自分のプロジェクトに両方のアプローチを使用しましたが、アプローチ1の唯一の欠点は、マッピングを行うためにリフレクションを使用するため、パフォーマンスのボトルネックがあることです。一方、アプローチ(b)では、コンパイル後にマッパーを生成しました。これは、純粋なゲッターおよびセッターベースのマッピングです。(パフォーマンスのボトルネックなし)

于 2013-07-22T15:48:50.990 に答える
0

あなたを助けるかもしれないDozerプロジェクトがあります(注:私はまだ使っていません)。

于 2013-07-22T15:49:51.780 に答える
0

「クレイジー」なアイデアは、 GSon ライブラリを使用することです。タイプ A のオブジェクトを JSON に変換してから、JSON をタイプ B のオブジェクトに変換します。

A と B に同じ名前のフィールドがある場合、値が設定されます。それ以外の場合はスキップされます。

    A a = ....
    Gson gson = new Gson();
    String json = gson.toJson(a);
    B b = gson.fromJson(json, B.class);
于 2013-07-22T15:45:18.667 に答える