Демаршалинг XML с использованием JAXB в методе AcceptRepresentation рестлета
-
21-08-2019 - |
Вопрос
Я создал схему 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);
}
}
}