Unmarshalling XML JAXB mit in acceptRepresentation Methode des Restlet
-
21-08-2019 - |
Frage
ich ein XML-Schema durch Kommentierung eine vorhandene Java-Domain-Modell-Klasse erstellt haben, jetzt, wenn ich versuche JAXB zu verwenden, um die Darstellung zu entordnen in meinem Restlet webservice erhielt ich bin ganz gleich eine Reihe von Fehlern zu bekommen, was ich scheinen zu versuchen, . Ich bin neu in beiden restlets und JAXB zeigt mir so in Richtung eines anständigen Beispiel beide mit hilfreich wäre nur ein ich habe es geschafft, so weit war hier zu finden: Beispiel
Meine Fehler sind:
Wenn ich versuche, die restlet.ext.jaxb JaxbRepresentation zu verwenden:
@Override
public void acceptRepresentation(Representation representation)
throws ResourceException {
JaxbRepresentation<Order> jaxbRep = new JaxbRepresentation<Order>(representation, Order.class);
jaxbRep.setContextPath("com.package.service.domain");
Order order = null;
try {
order = jaxbRep.getObject();
}catch (IOException e) {
...
}
von diesem erhalte ich eine
java.io.IOException: Unable to unmarshal the XML representation.Unable to locate unmarshaller.
Ausnahme bei jaxbRep.getObject()
So habe ich versucht, auch einen anderen Ansatz, um zu sehen, ob das einen Unterschied gemacht, mit dem folgenden Code statt:
@Override
public void acceptRepresentation(Representation representation)
throws ResourceException {
try{
JAXBContext context = JAXBContext.newInstance(Order.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Order order = (Order) unmarshaller.unmarshal(representation.getStream());
} catch( UnmarshalException ue ) {
...
} catch( JAXBException je ) {
...
} catch( IOException ioe ) {
...
}
Aber auch das gibt mir die folgende Ausnahme, wenn Aufruf JAXBContext.newInstance wird.
java.lang.NoClassDefFoundError: javax/xml/bind/annotation/AccessorOrder
Vielen Dank im Voraus für jede Beratung.
Lösung
Es scheint, gibt es ein paar Fehler hier war, hatte ich nie eine Klasse Object und ich wurde mit veralteten Versionen der JAXB Bibliotheken, nach dem Hinzufügen dieser Klasse und die Aktualisierung auf 2.1.11 scheint es jetzt zu arbeiten
Andere Tipps
Die jaxb Erweiterung für Restlet nicht auch für mich arbeiten. Ich habe die gleiche Unable to marshal
Ausnahme zusammen mit einigen Ausnahmen mehr. Merkwürdiger der JAXBContext.newInstance()
Anruf selbst arbeitete in meinem Code in Ordnung. Aus diesem Grund schrieb ich eine einfache JaxbRepresenetation Klasse:
public class JaxbRepresentation extends XmlRepresentation {
private String contextPath;
private Object object;
public JaxbRepresentation(Object o) {
super(MediaType.TEXT_XML);
this.contextPath = o.getClass().getPackage().getName();
this.object = o;
}
@Override
public Object evaluate(String expression, QName returnType) throws Exception {
final XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(this);
return xpath.evaluate(expression, object, returnType);
}
@Override
public void write(OutputStream outputStream) throws IOException {
try {
JAXBContext ctx = JAXBContext.newInstance(contextPath);
Marshaller marshaller = ctx.createMarshaller();
marshaller.marshal(object, outputStream);
} catch (JAXBException e) {
Context.getCurrentLogger().log(Level.WARNING, "JAXB marshalling error!", e);
throw new IOException(e);
}
}
}