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.

War es hilfreich?

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);
    }
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top