Wie kann ich in einer (Web Service-)Methode ein XML returnieren?

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich bekomme ein XML-String. Mit JAXB binde ich es an eine Klasse und kann somit unmarshalling, um daraus ein Java-Objekt zu erhalten. Danach kann ich das Java-Objekt marshallen, um daraus ein XML zu erhalten. Genau dieses XML-File soll von der Web Service returniert werden. Gibt es so eine Art "generic-XML" als Rückgabewert in Java?

Code:
public ****? gebeXMLaus(String xmldaten){


  return ****?;
}

Vielen Dank für Eure Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna:):)
 
vielleicht ist die Frage unverständlich formuliert, daher formuliere ich sie mal anders:

ich möchte gerne eine Methode schreiben, deren Rückgabewert ein Teil von einem XML-Dokument dienen soll. Beispiel:

Meine Methode soll folgendes ausgeben:
Code:
<Boden>
   <Typ>Stein</Typ>
   <Heizung>Ja</Heizung>
</Boden>

Das Methodenergebnis wird an dieses XML-Dokument hinzugefügt.

Code:
<Haus>
   <Dach>Kraftbolze</Dach>
   <Fenster>Gira</Fenster>
</Haus>

so dass am Ende folgendes entsteht:

Code:
<Haus>
   <Dach>Kraftbolze</Dach>
   <Fenster>Gira</Fenster>
   <Boden>
        <Typ>Stein</Typ>
        <Heizung>Ja</Heizung>
   </Boden>
</Haus>

Mir geht es lediglich darum, was für einen Rückgabewert ich für meine Methode angeben soll. Es geht nicht um das "Anbringen" des Boden-Tags in das Haupt-XML.

Meine Frage:
Da wir ja wissen, wofür das Methodenergebnis später genutzt wird, haben wir zu entscheiden, welchen Rückgabetyp die Methode zu returnieren hat. Geht denn String als Rückgabewert ohne weiteres für den Zweck?
Code:
public String gebeTeil-XMLaus(){...}

Ich habe versucht zu googeln, ob eine Art "generic-XML" als Java-Datentyp existiert, ist aber scheinbar nicht der Fall.

Insbesondere, wie kann ich mit Hilfe der Methode myMarshaller.marshal den XML-Abschnitt als Text ausgeben?

Vielen Dank

Viele Grüße aus Rheinland,

Eure Ratna:)
 
Hi,

es gibt an dieser Stelle mehrere Möglichkeiten.

Die einfachste, aber wahrscheinlich aufwendigste, ist es, einen String zurück zu geben.
Das kann allerdings zu Performance-Problemen führen, denn du wandelst das Ergebnis in einen String um, um ihn dann in einer anderen Methode wieder in ein Objekt zu überführen (um beispielsweise in einen XML-Abschnitt etwas einzufügen).

An der Stelle wären wir auch schon bei den anderen beiden Möglichkeiten:

a)
Du weißt, dass IMMER nur etwas vom Typ Boden aus dem XML-geholt wird. Dann kannst du natürlich den Typ Boden auch als Rückgabetyp angeben. Das hat aber wiederum den Nachteil, dass die Methode sehr statisch und nicht flexibel ist.

b)
Es können mehrere Typen zurückgegeben werden.
In deinem Falle schreit das für mich schon fast nach einem Interface. Was du da zurück gibst, ist meistens eine Teile-Ganzes-Relation. Der Boden ist ja ein Teil des Hauses und das Dach auch.
Demnach könnte man ein Interface Partial schreiben. Jede Java-Klasse, welche ein Element des XML repräsentiert und in der Hierarchie unter Haus einzuordnen ist, implementiert dann dieses Interface.
Das ist dann auch gleichzeitig der Rückgabetyp der Methode.
Hat den Vorteil, dass du nicht erst wieder in einen String zurück wandeln musst, sondern eine Instanz eines Elementes (XML) an deine Methode schicken kannst, die sich um die Eingliederung kümmert.

Ich hoffe, dass das einigermaßen verständlich war.
Falls du noch Fragen hast, dann immer raus damit.
 
vielen Dank Alex_T für die ausführlichen Vorschläge. Ich habe die Variante a) von Dir genommen, hat super geklappt.

Viele Grüße aus Rheinland,

Eure Ratna
 
Zurück