在restlet的acceptRepresentation方法中使用JAXB解组XML

时间:2009-06-29 23:04:17

标签: xml jaxb restlet unmarshalling

我通过注释现有的Java域模型类创建了一个XML模式,现在当我尝试使用JAXB解组我的restlet webservice中收到的表示时,无论我怎样尝试,我都会遇到大量错误。我是两个restlets和JAXB的新手,所以指向一个使用两者的一个体面的例子的方向将是有帮助的,我到目前为止找到的只有一个在这里:Example

我的错误是:

如果我尝试使用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 :(得分:0)

这里似乎有一些错误,我从来没有过ObjectFactory类,而且我使用的是JAXB库的过时版本,在添加这个类并更新到2.1.11后它似乎现在可以正常工作

答案 1 :(得分:0)

Jaxb Extension for 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);
    }
}
}