XML unmarshalling utilisant JAXB dans la méthode de acceptRepresentation de Restlet
-
21-08-2019 - |
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.
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);
}
}
}