Распаковка XML с использованием JAXB в методе acceptRepresentation рестлета - PullRequest
0 голосов
/ 30 июня 2009

Я создал XML-схему, аннотируя существующий класс модели домена Java, теперь, когда я пытаюсь использовать JAXB для отмены маршалинга представления, полученного в моем веб-сервисе рестлета, я получаю массу ошибок независимо от того, что я пытаюсь , Я новичок как в рестлетах, так и в JAXB, поэтому указание мне в направлении приличного примера использования обоих было бы полезно, только один, который мне удалось найти, был здесь: Пример

Мои ошибки:

Если я попытаюсь использовать 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) {
    ...
}

из этого я получаю java.io.IOException: Unable to unmarshal the XML representation.Unable to locate unmarshaller. исключение на jaxbRep.getObject()

Так что я также попробовал другой подход, чтобы увидеть, если это имеет значение, вместо этого используя следующий код:

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

Однако это также дает мне следующее исключение при вызове JAXBContext.newInstance.

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

Заранее спасибо за любые советы.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2010

Расширение Jaxb для Restlet не работает для меня тоже. Я получил то же самое исключение Unable to marshal вместе с еще несколькими исключениями. Странно, но сам вызов JAXBContext.newInstance() работал нормально в моем коде. Из-за этого я написал простой класс 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);
    }
}
}
0 голосов
/ 21 июля 2009

Кажется, здесь произошла пара ошибок, у меня никогда не было класса ObjectFactory, и я использовал устаревшие версии библиотек JAXB, после добавления этого класса и обновления до 2.1.11 он, кажется, теперь работает

...