我通过注释现有的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
提前感谢任何建议。
答案 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);
}
}
}