Pregunta

He creado un esquema XML anotando una clase de modelo de dominio Java existente, ahora cuando trato de usar JAXB para Resolver referencia a la representación recibida dentro de mi servicio web Restlet estoy recibiendo una gran cantidad de errores no importa lo que parece que intenta . Soy nuevo en ambos restlets y JAXB por lo que me apunta en la dirección de un ejemplo digno de usar tanto sería útil único que he conseguido encontrar hasta ahora estaba aquí: Ejemplo

Mis errores son:

Si trato de utilizar el JaxbRepresentation restlet.ext.jaxb:

@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 este recibo una java.io.IOException: Unable to unmarshal the XML representation.Unable to locate unmarshaller. excepción a jaxbRep.getObject()

Así que también intentó un enfoque diferente para ver si eso hizo una diferencia, usando el siguiente código en su lugar:

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

Sin embargo, esto también me da la siguiente excepción cuando se hace la llamada a JAXBContext.newInstance.

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

Gracias de antemano por cualquier consejo.

¿Fue útil?

Solución

Parece que hubo un par de errores aquí, nunca he tenido una clase ObjectFactory y que estaba usando de versiones no actualizadas de las bibliotecas JAXB, después de añadir esta clase y actualización a 2.1.11 parece que funciona ahora

Otros consejos

La extensión de JAXB para Restlet no funcionaba para mí también. Tengo el mismo Unable to marshal Excepción junto con algunas excepciones más. Extrañamente la JAXBContext.newInstance() llaman en sí funcionaba bien en mi código. Debido a eso, escribí una clase JaxbRepresenetation simple:

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);
    }
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top