Демаршалинг XML с использованием JAXB в методе AcceptRepresentation рестлета

StackOverflow https://stackoverflow.com/questions/1061001

Вопрос

Я создал схему XML, аннотируя существующий класс модели предметной области Java, и теперь, когда я пытаюсь использовать JAXB для демаршализации представления, полученного в моем веб-сервисе restlet, я получаю множество ошибок, независимо от того, что я пытаюсь сделать.Я новичок как в рестлетах, так и в 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

Заранее благодарю за любой совет.

Это было полезно?

Решение

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

Другие советы

Расширение 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);
    }
}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top