2009-06-29 5 views
0

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

Мои ошибки:

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

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

@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 

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

ответ

0

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

0

Расширение 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

Создание экземпляра маршаллера для каждой записи() очень дорого. Restlet кэширует экземпляры, так что это происходит один раз. Я думаю, проблема может заключаться в том, что Restlet привязывается к автономной jaxb jar вместо использования реализации, которая входит в JRE. Я собираюсь изучить эту проблему, потому что это вызывает проблемы в App Engine. – ZiglioUK