gpt4 book ai didi

java - 如何正确解码基于模式的请求结果(即 xwiki)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:17 27 4
gpt4 key购买 nike

我使用了XWiki Schema Definition使用 Eclipse XJC Binding Compiler 创建对象类模型。在 package-info.java 中创建以下命名空间

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.xwiki.org", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.xwiki.rest.model.jaxb;

当我读到 Example from an HttpResponse

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<page xmlns="http://www.xwiki.org">
<link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main" />
...
</page>

使用 JAXB

try {
JAXBContext context = JAXBContext.newInstance(org.xwiki.rest.model.jaxb.Page.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
InputStream is = new FileInputStream(new File("request_result.xml"));
Page page = (Page) unmarshaller.unmarshal(is);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

异常

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.xwiki.org", local:"page"). Expected elements are <{http://www.xwiki.org}attachments>,<{http://www.xwiki.org}classes>,<{http://www.xwiki.org}comments>,<{http://www.xwiki.org}history>,<{http://www.xwiki.org}objects>,<{http://www.xwiki.org}pages>,<{http://www.xwiki.org}properties>,<{http://www.xwiki.org}searchResults>,<{http://www.xwiki.org}spaces>,<{http://www.xwiki.org}tags>,<{http://www.xwiki.org}wikis>
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:648)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236)
...

被抛出。

我不明白出了什么问题,因为命名空间似乎是正确的。我必须更改什么才能获得有效的 XWiki RESTful API?

最佳答案

page 元素的映射可能位于生成的 ObjectFactory 类上的 @XmlElementDecl 注释上。您可以将 JAXBContext 创建更改为以下内容来选择它:

JAXBContext context = JAXBContext.newInstance(org.xwiki.rest.model.jaxb.ObjectFactory.class);

或者您可以在生成的模型的包名称上创建 JAXBContext:

JAXBContext context = JAXBContext.newInstance("org.xwiki.rest.model.jaxb");
<小时/>

更新

Thanks, that helped a little. Now i get Exception in thread "main" java.lang.ClassCastException: javax.xml.bind.JAXBElement cannot be cast to org.xwiki.rest.model.jaxb.Page.

当使用 @XmlElementDecl 而不是 @XmlRootElement 对根进行注释时,您得到的结果是包含域类实例的 JAXBElement 实例。

您可以执行以下操作:

JAXBElement<Page> jaxbElement = (JAXBElement<Page>) unmarshaller.unmarshal(is);
Page page = jaxbElement.getValue();

或者:

Page page = (Page) JAXBIntrospector.getValue(unmarshaller.unmarshal(is));

了解更多信息

我在我的博客上写了有关此特定用例的更多信息:

关于java - 如何正确解码基于模式的请求结果(即 xwiki)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com