Wie marshall ein string mit JAXB, dass manchmal enthält XML-Inhalt und manchmal nicht?
Betrachten Sie dieses Beispiel -
Habe ich eine Klasse namens Bericht, der ein Feld vom Typ Nachricht. Die Message-Klasse hat ein Feld namens "body" das ist ein string. "Körper" kann eine beliebige Zeichenfolge sein, aber manchmal ist es enthält richtig formatierte XML-Inhalt. Wie kann ich sicherstellen, dass, wenn der "Körper" enthält die XML-Inhalte, die Serialisierung erfolgt in form einer XML-Struktur statt, was gibt es zu präsentieren?
Hier ist der code mit der Ausgabe -
Bericht Klasse
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement(name = "Report")
@XmlType(propOrder = { "message"})
public class Report
{
private Message message;
public Message getMessage() { return message; }
public void setMessage(Message m) { message = m; }
}
Nachricht Klasse
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlType(propOrder = { "body" })
public class Message
{
private String body;
public String getBody() { return body; }
@XmlElement
public void setBody(String body) { this.body = body; }
}
Main
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class SerializationTest
{
public static void main(String args[]) throws Exception
{
JAXBContext jaxbContext = JAXBContext.newInstance(Report.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Report report = new Report();
Message message = new Message();
message.setBody("Sample report message.");
report.setMessage(message);
jaxbMarshaller.marshal(report, System.out);
message.setBody("<rootTag><body>All systems online.</body></rootTag>");
report.setMessage(message);
jaxbMarshaller.marshal(report, System.out);
}
}
Die Ausgabe ist wie folgt -
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report>
<message>
<body>Sample report message.</body>
</message>
</Report>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report>
<message>
<body><rootTag><body>All systems online.</body></rootTag></body>
</message>
</Report>
Wie Sie sehen können in der Ausgabe oben, für die zweite Instanz von "Körper", die Serialisierung erzeugt
<body><rootTag><body>All systems online.</body></rootTag></body>
statt
<body><rootTag><body>All systems online.</body></rootTag></body>
Wie dieses problem zu lösen?
InformationsquelleAutor CodeBlue | 2012-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: ich bin der EclipseLink JAXB (MOXy) führen und ein Mitglied der JAXB (JSR-222) expert group.
Dieser use case zugeordnet ist, mit der
@XmlAnyElement
Anmerkung und der Angabe einerDOMHandler
. Es erscheint Fehler, wenn Sie diese mit der JAXB RI, aber die folgenden use-case arbeitet mit EclipseLink JAXB (MOXy).BodyDomHandler
Standardmäßig eine JAXB impleemntation repräsentieren nicht zugeordnete Inhalte als DOM-Knoten. Nutzen Sie eine
DomHandler
um eine Alternative Darstellung der DOM, In diesem Fall vertreten wir den DOM alsString
.Nachricht
Unten ist, wie würden Sie die
@XmlAnyElement
annotation auf IhreMessage
Klasse.Ausgabe
Unten ist die Ausgabe aus der Ausführung Ihrer
SerialziationTest
:Weitere Informationen
HINWEIS - Bug in JAXB RI
Es scheint ein bug in der JAXB-Referenz-Implementierung und Beispiel-code wird in einem stack-trace wie folgt:
Ja, es scheint ein bug in JAXB (JSR-222) Umsetzung wrt diesem Beispiel. Ich EclipseLink verwendet JAXB (MOXy), um das Beispiel zusammen.
Wow. Warum haben Sie nicht behoben es noch?
Sie könnten die Datei einen neuen bug: java.net/jira/browse/JAXB
und BDoughan : Ist dieser Fehler behoben? Ich bin auch immer diese Fehlermeldung.
InformationsquelleAutor bdoughan
Wenn es nur für Marshalling und zu ignorieren, die < und >,
Wir können Folgendes verwenden:
InformationsquelleAutor Lokesh
3 verschiedenen Lösungen zu 1), 2) und 3), hier unten :
1) Folgende Beitrag ist die Beschreibung Ihrer Lösung Loresh :
http://anna-safronova.livejournal.com/2524.html?thread=9180
Ist das noch fehlende Beschränkungen details.
Mit embeeded html -, wir brauchen eine
<![CDATA
blockJAXB die Abhängigkeit
com.Sonne.xml.binden.marshaller.CharacterEscapeHandler
Muss importieren jaxb-impl für die Kompilierung /und können zur Ausführung, z.B.
2) Ein ähnlicher Ansatz ist JDK ' s rt.jar Abhängigkeit
com.Sonne.xml.intern.binden.CharacterEscapeHandler
http://theopentutorials.com/tutorials/java/jaxb/jaxb-marshalling-and-unmarshalling-cdata-block/
Dieselbe Einschränkung /dependends auf Ziel-JDK, und einige tweaks auf Eclipse/Maven notwendig sind (schlechte alternative /Meiner Meinung nach)
3) Schließlich die beste Lösung gefunden wurde, die auf einem anderen post von Reg Whitton :
https://stackoverflow.com/a/12637295/560410
- und dies ist die detaillierte reciepe :
http://javacoalface.blogspot.co.uk/2012/09/outputting-cdata-sections-with-jaxb.html
Funktionierte perfekt für mich !
InformationsquelleAutor skay