2012-03-30 9 views
2

Ich habe einen Dienst, der "Benutzerprofile" unter verschiedenen Detaillierungsgrad oder verschiedenen Ausführlichkeitsmodi liefern kann.JAXB/EclipseLink: Typ dynamisch auflösen

Diese Benutzerprofile sind in einer Datenbank mit JPA2 synchronisiert und alles funktioniert gut. Mit MOXy (EclipseLink) serialisiere ich auch die Profile in XML, und alles funktioniert auch hier gut.

Die Ausführlichkeitsmodi (KURZ, ZUSAMMENFASSUNG, VOLL) werden jedoch durch das Vorhandensein oder Nichtvorhandensein bestimmter Elemente in den in XML serialisierten Benutzerprofilen implementiert (z. B. sollte das Element QueryHistory bei Verwendung des Ausführlichkeitsbereichs KURZ nicht serialisiert werden) Modus).

In wenigen Worten: Ich möchte zu einem JAXBContext angeben, dass einige Elemente nicht serialisiert werden müssen und ich es zur Laufzeit angeben möchte.

Wenn ich gut verstanden, MOXy Extensible Models - Refresh http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html ist in der Lage, das zu tun, aber ist hier jemand eine einfachere Möglichkeit, diese Funktion zu implementieren wissen?

Antwort

2

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und Mitglied der JAXB 2 (JSR-222) Expertengruppe.

Um das Konzept der verschiedenen Ansichten auf Ihre Daten zu unterstützen, würde ich empfehlen, eine andere Instanz von JAXBContext zu haben, um jede der Zuordnungen darzustellen: KURZ, ZUSAMMENFASSUNG, VOLL. Mit MOXy können Sie mehrere Zuordnungen auf ein Domänenmodell anwenden, indem Sie dessen external mapping document nutzen.

Strategies

  1. Annotations vollständige Modell abzubilden und XML-Metadaten Zuordnungen
  2. Anmerkungen zur Karte Minimalmodell zu reduzieren verwenden und Mappings von XML-Metadaten zu erweitern

verwenden Beispielcode

Drei Instanzen von JAXBContext auf der gleichen Klasse (UserProfile), aber mit verschiedenen Mappings, die von MOXys externem Mapping-Dokument gesteuert werden.

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); 

Im Folgenden finden Sie ein Beispiel, das kann ein JAXBContext von mehreren Mapping-Dokumente zeigt, wie Bootstrap werden.

Extensible Modelle

Die Möglichkeit, die Zuordnung von Metadaten in moxy zu erweitern richtet sich an Entwickler eine laufende Anwendung eine Änderung an den Metadaten der Suche zu machen, ohne abschalten zu müssen. Ein Beispiel hierfür ist ein Domänenmodell, das eine Online-Umfrage unterstützt, die zur Unterstützung einer neuen Frage erweitert werden muss.

+0

Vielen Dank für die Antwort. Allerdings verstehe ich nicht, wie man eine Zuordnungsdatei über mein vorhandenes Modell verwendet. Eigentlich könnte das beste sein, das Modell zu haben (klassische JPA-Entitäten), und dann eine Mapping-Datei verwenden, um das Modell zu beschneiden. Aber wie ich es getestet habe, wird die Mapping-Datei nicht berücksichtigt. Sogar mit einem JAXBHelper.getJAXBContext (jc) .refeshMetadata(); – njames

+0

@njames - Ich habe meine Antwort mit einer Strategie aktualisiert, die Sie verwenden können. Ich empfehle, verschiedene Instanzen von JAXBContext für die verschiedenen Mapping-Ebenen zu verwenden, anstatt die Metadaten zu aktualisieren. –

+0

Danke für Ihre klare Antwort! aber ich habe schon so gearbeitet. Meine Frage ist: Wie ich ein vorhandenes JPA/JAXB-Modell mit annotierter Klasse habe, gibt es eine Möglichkeit, eine Zuordnungsdatei zu verwenden, um das vorhandene Modell zu "überschreiben"? Meine Bedenken ist, dass ich nicht auf das Modell ändern kann (noch Annotationen entfernen, um nur Mapping-Dateien zu verwenden) – njames