2009-10-09 14 views
5

Ich habe eine Reihe von JAXB Beans, die direkt mit Jersey marshalled und unmarshaled werden.JAXB Collections (Liste <T>) Verwenden Sie Pascal Case anstelle von Camel Case für Elementnamen

z.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Artifact", propOrder = { 
    "artifactId", 
    "artifactType", 
    "contentHash" 
}) 
@XmlSeeAlso({ 
    EmailArtifact.class, 
    ManagedDocArtifact.class 
}) 
@XmlRootElement(name ="Artifact") 
public class Artifact { 

    protected String artifactId; 
    protected String artifactType; 
    protected String contentHash; 

... 
... 
... 

} 

Wenn ich eine GET-Methode erstellen, die ein einzelnes Artefaktobjekt zurückgibt. Es produziert korrekt die XML:

<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 

Hier habe ich in der Lage gewesen, den Namen des Artifact Element erfolgreich zu steuern, zu Beginn ein großes „A“ zu haben.

Allerdings habe ich eine GET-Methode erstellen, die Sammlung von Artefakt-Objekten zurückgibt, ich am Ende mit:

<artifacts> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
</artifacts> 

Wie Sie das äußere Element sehen für die Sammlung einen Kleinbuchstaben „A“ hat. Um unserem eigenen internen Standard zu entsprechen, möchte ich, dass dies ein großes "A" - Artefakt ist.

Ich kann nicht sehen, wo dies in JAXB definiert werden kann, ist es tatsächlich das Jersey-Framework, das dies steuert?

Können wir den für Sammlungen generierten Elementnamen kontrollieren?

Vielen Dank,

James

+1

1. AFAIK JAXB ermöglicht es Ihnen nicht, eine Sammlung zu marshall (zum Beispiel '' Arraylist ) als solche. Aber es ermöglicht Ihnen, ein Objekt zu serialisieren, das eine Sammlung als Eigenschaft besitzt. 2.Ich bin mit Jersey nicht vertraut, aber ich denke, Sie müssen wissen, ob es JAXB ist, die jedes Artefakt separat serialisiert und eine andere Schicht (Jersey) das gesamte Dokument der Stücke erstellt oder ist es JAXB, das XML für die Sammlung produziert. 3. Konnten Sie etwas Code veröffentlichen (oder irgendwo veröffentlichen) - wie man es nennt? Ich habe es mit einem einfachen JAXB versucht, aber das entspricht nicht deinem Setup. –

+1

Ich vermute, dass Sie Recht haben - es ist Jersey, das mir erlaubt, die Sammlung von JAXB Beans Marshall/Marshall/Marshall/Marshall/Marshall/Marshall/Marshall/Marshall/Marshalls (ich habe dies mit der Jersey-Benutzergruppe auch angesprochen). Daher hoffe ich, dass es eine Konfiguration gibt, die es mir erlaubt, den Namen oder die Regeln hinter dem XML-Elementnamen für Sammlungen festzulegen ... Wir werden abwarten. Wie Sie darauf hinweisen, besteht eine Umgehungslösung darin, eine neue JAXB-Bean zu erstellen - sagen wir "Artifacts", die ein einzelnes Auflistungselement aufweist, z. Liste Artefakte - dies fühle ich, obwohl eine ganze Reihe von Klassen eingeführt, die nicht viel Wert hinzufügen. Danke für die Hilfe. James – jallch

Antwort

9

Versuchen @XmlElementWrapper mit, die das name Attribut unterstützt:

@XmlElementWrapper(name="ELEMENTS") 
@XmlElement(name="ELEMENT") 
protected final List<String> elements = new LinkedList<String>(); 

produzieren

<ELEMENTS> 
    <ELEMENT>one</ELEMENT> 
    <ELEMENT>two</ELEMENT> 
    ... 
</ELEMENTS> 

die JAXB Tutorial für diese Funktion sehen.

+1

Hallo, leider bin ich mir des XmlElementWrapper bewusst, aber es trifft nicht auf meinen Anwendungsfall zu. Innerhalb von Jersey können Sie Sammlungen von JAXB-Bohnen produzieren und konsumieren. z.B. öffentliche Liste getMyBeans Sie können XmlElementWrapper nicht verwenden, um die MyBean-Klasse mit Anmerkungen zu versehen - Sie können diese Annotation nur für eine Eigenschaft der Klasse verwenden, z. eine Sammlung innerhalb der Klasse. Das wäre also nicht gut. Es gibt eine Lösung darin, dass ich eine neue Klasse verwenden könnte, die eine Sammlung enthält - aber um ehrlich zu sein, kreiert man eine Klasse innerhalb des Designs, die nicht wirklich benötigt wird. – jallch

+0

Das Gute an XML ist: es kann auf 1000 Arten transformiert werden;) Sie könnten ** XSLT ** oder ** DOM ** verwenden. –

+0

Vielen Dank, Ihre Lösung hat ein weiteres Problem mit der Serialisierung von Listen gelöst. – Pragmateek

5

OK - Ich habe ein Update vom Community Leader von Java Jersey - Paul Sandoz. Dies ist derzeit ein offenes Problem mit dem Jersey-Framework und etwas, das wir umgehen oder akzeptieren müssen, bis es in einem zukünftigen Update behoben wird.

Die Problemumgehung, wie in einem der obigen Kommentare erläutert, ist die Einführung einer neuen Klasse für jede Webdienstmethode, die eine Auflistung (z. B. Liste) JAXB annotierter Beans zurückgibt. Diese Klasse ist effektiv eine Klasse, die nur ein Mitglied enthält - eine Liste der JAXB-Beans. Anstatt die Liste in der Web-Service-Methode zurückzugeben, geben wir stattdessen die spezielle Klasse zurück. Weil wir die Kontrolle über den Namen der neuen Klasse in der XML haben, z.B. @XmlRootElement (name = "Artifacts") können wir das Problem kurzfristig umgehen.

Hoffe, das hilft.

Grüße,

James

+0

Wissen Sie, ob es in der aktuellen Jersey-Version (1.11) eine Lösung gibt? Oder irgendein Zeiger auf Jersey Diskussion/Problem auf der Funktion? – Yaegor

Verwandte Themen