Question

J'ai créé un schéma XML en annotant une classe de modèle de domaine Java existant, maintenant, quand je tente d'utiliser JAXB pour unmarshall la représentation reçue dans mon Restlet webservice je reçois une foule d'erreurs, peu importe ce que je semble essayer . Je suis nouveau à la fois restlets et JAXB donc me pointant dans la direction d'un exemple décent utilisant à la fois serait utile que celui que j'ai réussi à trouver jusqu'à présent était ici: Exemple

Mes erreurs sont:

Si je tente d'utiliser le restlet.ext.jaxb JaxbRepresentation:

@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) {
    ...
}

de ce que je reçois java.io.IOException: Unable to unmarshal the XML representation.Unable to locate unmarshaller. exception à jaxbRep.getObject()

J'ai donc essayé aussi une approche différente pour voir si cela fait une différence, en utilisant le code suivant à la place:

@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 ) {
    ...
}

Cependant, cela me donne aussi l'exception suivante lorsque l'appel à JAXBContext.newInstance est fait.

java.lang.NoClassDefFoundError: javax/xml/bind/annotation/AccessorOrder

Merci d'avance pour tout conseil.

Était-ce utile?

La solution

Semble il y avait quelques erreurs ici, je ne ai jamais eu une classe ObjectFactory et j'utilisais sur les versions à jour des bibliothèques JAXB, après l'ajout de cette classe et la mise à jour à 2.1.11, il semble fonctionner maintenant

Autres conseils

L'extension JAXB pour Restlet ne fonctionne pas pour moi aussi. Je suis la même exception avec Unable to marshal quelques exceptions plus. Étrangement l'appel lui-même JAXBContext.newInstance() a bien fonctionné dans mon code. A cause de cela, je l'ai écrit une classe simple JaxbRepresenetation:

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);
    }
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top