3

リクエストとユーザーに基づいてフィールドを選択的にシリアル化したい。

たとえば、管理者ユーザーには、いくつかの追加フィールドを含む XML が提供されます。一方、通常のユーザーは、これらのフィールドのない XML を取得します。

@XmlIDREF第二に、現在、参照されているオブジェクトまたはコレクションの不要な拡張を防ぐために使用しています。

ただし、ユーザーがそれらの詳細を必要とする場合もあります。参照されたオブジェクトに対して 2 番目の要求を行うことは望ましくありません。XYZ属性を展開する必要があることをユーザーにサーバーに伝えたい(つまり、参照だけでなく完全なオブジェクトを含める)

ユーザーとリクエストが与えられると、ビジネス ロジックに基づいて、どのフィールドをシリアル化する必要があるかがわかります。この情報を JAXB に伝えるにはどうすればよいでしょうか。

可能な限り、XSD を作成したくありません。リクエスト パラメータは動的であることに注意してください。シリアル化するフィールドは実行時に決定されます。そのため、ハードコーディングする必要があるもの@Transient(または@XmlIDREF注釈など) を使用することはできません。

4

2 に答える 2

2

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

EclipseLink 2.5 (ここから入手: http://www.eclipse.org/eclipselink/downloads/milestones.php ) では、MOXy JAXB に Object Graphs という新しい機能を追加しました。オブジェクト グラフを使用すると、プログラムまたはメタデータを使用して、マーシャリング/アンマーシャリングするプロパティのサブセットを選択できます。Customer以下は、 、Address、およびPhoneNumberモデルからデータのサブセットを取得するオブジェクト グラフを作成する例です。

    // Create the Object Graph
    ObjectGraph contactInfo = JAXBHelper.getJAXBContext(jc).createObjectGraph(Customer.class);
    contactInfo.addAttributeNodes("name");
    Subgraph location = contactInfo.addSubgraph("billingAddress");
    location.addAttributeNodes("city", "province");
    Subgraph simple = contactInfo.addSubgraph("phoneNumbers");
    simple.addAttributeNodes("value");

    // Output XML - Based on Object Graph
    marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, contactInfo);
    marshaller.marshal(customer, System.out);

詳細については

于 2013-05-11T11:18:45.643 に答える
2

XSD についても掘り下げるつもりはありません。ここで私のアドバイス:

1- デフォルトでは、JAXB は null フィールドをシリアライズしません。したがって、フィールドを単純に無効にすることができ、シリアル化したくありません。

もう少しクリーンにするために、ビジネス オブジェクトのコピーを無効にすることをお勧めします。アプリケーションに副作用がないようにするためです。


2-マップと保存を使用してフィールドを動的にすることもできます<String, Object>。これにより、フィールドのライフサイクルを完全に制御できます。

編集:キーは変数名になり、値はオブジェクト参照になります。値がプリミティブであると想定されている場合は、値を関連するオブジェクト コンテナーに自動ボックス化できます。JAXB は、マップからすべての既存の値をシリアル化します。

複数のクラスでキー定義を共有する必要がある場合は、(キー、値) の作成/破棄を別のクラスにカプセル化することをお勧めします。


3- 同時に null になるか、またはそうでない属性の特定のセットを強制したい場合、および次の抽象化がアプリケーションにとって意味がある場合。異なる属性を持つ子クラスのサブセットを定義することもできます。親クラスには必須属性があります。

幸運を

于 2013-05-11T10:32:47.633 に答える