2012-03-30 5 views
2

私は、異なるレベルの詳細または異なる冗長モードで「ユーザープロファイル」を提供できるサービスを提供しています。JAXB/EclipseLink:動的に型を解除する

これらのユーザープロファイルは、JPA2とデータベースで同期され、すべて正常に動作しています。 MOXy(EclipseLink)の使用私はXMLでプロファイルもシリアル化していますが、ここでもうまくいきます。

ただし、冗長モード(BRIEF、SUMMARY、FULL)は、XMLでシリアル化されたユーザープロファイル内の特定の要素の有無によって実装されます(QueryHistory要素、たとえばBRIEF冗長性モード)。

いくつかの単語で:JAXBContextに、いくつかの要素をシリアライズしてはならないことを指定したいと思います。を実行時にに指定したいとします。

MOXy Extensible Models - Refresh http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.htmlがこれを行うことができますが、この機能を実装するためのより簡単な方法は誰かが知っていますか?

答えて

2

注:私はEclipseLink JAXB (MOXy)リードとJAXB 2 (JSR-222)専門家グループのメンバーです。

データのさまざまなビューの概念をサポートするために、JAXBContextの別のインスタンスを使用して、各マッピングを表現することをお勧めします:BRIEF、SUMMARY、FULL。 MOXyでは、external mapping documentを利用して、ドメインモデルに複数のマッピングを適用できます。

戦略

  1. 注釈フルモデルをマッピングし、マッピング

を展開する最小限のモデルをマッピングし にXMLメタデータを使用する マッピング

  • 注釈を減らすためにXMLメタデータを使用します例コード

    JAXBContextの3つのインスタンスが同じクラス(UserProfile)で構築されていますが、異なるマッピングがMOXyの外部マッピングドキュメントによって制御されています。以下は

    JAXBContext briefContext = JAXBContext.newInstance(UserProfile.class); 
    
    Map<String, Object> summaryProperties = new HashMap<String, Object>(1); 
    summaryProperties.put("eclipselink-oxm-xml", "summaryMapping.xml"); 
    JAXBContext summaryContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, summaryProperties); 
    
    List<String> fullMappingXMLs = new ArrayList(2); 
    fullMappingXMLs.add("summaryMapping.xml"); 
    fullMappingXMLs.add("fullMapping.xml"); 
    Map<String, Object> fullProperties = new HashMap<String, Object>(1); 
    fullProperties.put("eclipselink-oxm-xml", fullMappingXMLs); 
    JAXBContext fullContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, fullProperties); 
    

    JAXBContextは、複数のマッピングドキュメントからブートストラップすることができます方法を示す例です。

    拡張モデル

    MOXYにマッピング・メタデータを拡張する機能が実行中のアプリケーションを停止することなく、メタデータに変更を加えるために探して、開発者を対象としています。たとえば、新しい質問をサポートするために強化する必要のあるオンライン調査を支援するドメインモデルがその例です。

  • +0

    答えをいただき、ありがとうございます。しかし、私は既存のモデルとのマッピングファイルを使用する方法を理解していません。実際には、モデル(古典的なJPAエンティティ)を持つことが最善であり、モデルを整理するマッピングファイルを使用することができます。しかし私はそれをテストしたので、マッピングファイルは考慮されていません。 JAXBHelper.getJAXBContext(jc).refeshMetadata();であっても。 – njames

    +0

    @njames - あなたが使用できる戦略で自分の答えを更新しました。メタデータをリフレッシュするのではなく、異なるレベルのマッピングに対して 'JAXBContext'の異なるインスタンスを使うことをお勧めします。 –

    +0

    あなたの明確な答えをありがとう!しかし私はすでに実際にこの方法で働いていました。私の質問は、注釈付きクラスを持つ既存のJPA/JAXBモデルを持っているので、既存のモデルを「上書きする」ためにマッピングファイルを使用する方法がありますか?私の懸念は、私がモデルに変更することはできません(また、マッピングファイルのみを使用するアノテーションも削除します)。 – njames