0

我通过注释现有的 Java 域模型类创建了一个 XML 模式,现在当我尝试使用 JAXB 来解组在我的 restlet Web 服务中收到的表示时,无论我尝试什么,我都会遇到很多错误。我对restlets和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

提前感谢您的任何建议。

4

2 回答 2

0

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

于 2009-07-21T13:33:26.330 回答
0

Restlet 的 Jaxb 扩展也不适用于我。我得到了相同的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);
    }
}
}
于 2010-04-16T11:47:03.777 回答