Java Can';使用默认名称空间时,t解组封送的文档
我建立了一个回购协议,显示了我的问题: 我尝试解组一个简单的xml文档:Java Can';使用默认名称空间时,t解组封送的文档,java,xml,jaxb,eclipselink,Java,Xml,Jaxb,Eclipselink,我建立了一个回购协议,显示了我的问题: 我尝试解组一个简单的xml文档: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"> <Export xmlns
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx">
<Export xmlns="urn:adcubum:Syrius">
<ExportInhalt/>
<ExportKopf>
<Quelle>lokal</Quelle>
</ExportKopf>
<SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion>
</Export>
</for:document>
文件如下:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "document", namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx")
public class Document {
@XmlElement(name = "Export", namespace = "urn:adcubum:Syrius")
private vo.dom.common_service.modul_bl.syrius.Export export;
}
package-info.java
@XmlSchema(
namespace = "urn:adcubum:Syrius",
xmlns = {
@XmlNs(prefix = "for", namespaceURI = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"),
@XmlNs(prefix = "", namespaceURI = "urn:adcubum:Syrius")
},
elementFormDefault = XmlNsForm.UNQUALIFIED)
当我试图解组它时,我没有得到映射的数据:
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
InputStream is = this.getClass().getResourceAsStream("/requests/document_simple3.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader xmlsr = factory.createXMLStreamReader(is);
Document document = unmarshaller.unmarshal(xmlsr, Document.class).getValue();
ExportKopf和ExportInhalt返回null
相反,遵循xml是可行的。唯一的区别是名称空间前缀:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx">
<ns3:Export xmlns:ns3="urn:adcubum:Syrius">
<ExportInhalt/>
<ExportKopf>
<Quelle>lokal</Quelle>
</ExportKopf>
<SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion>
</ns3:Export>
</for:document>
洛卡尔
bec811a9807a8c8da403d70b9b5e22ad
我正在使用eclipselink moxy
我必须更改什么,以便对封送的文档进行解组。我认为,每当JAXB中发生类似这样的奇怪情况时,查看映射的实际XSD模式总是一个好主意。您可以使用以下代码轻松地做到这一点
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);
jaxbContext.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
StreamResult streamResult = new StreamResult(new PrintWriter(System.err) {
@Override
public void close() {
}
});
streamResult.setSystemId(suggestedFileName);
return streamResult;
}
});
这将打印应该反映您的JAXB模型的模式(您可以使用另一个编写器将它们写入文件)。XSD文件通常非常能揭示这类问题。我认为您的问题在于@XmlSchema
映射。您应该尝试使用elementFormDefault=XmlNsForm.QUALIFIED
。在映射中使用多个名称空间时,最好使用限定的
EDIT:虽然JAXB映射的主要问题是elementFormDefault
的值错误和/或缺失,但要使repo中的代码正常工作,还必须解决其他问题
文档
中的导出
元素缺少命名空间声明(在您的示例中,文档
和导出
元素是不同命名空间的一部分)
- 缺少导出包中的
elementFormDefault=XmlNsForm.QUALIFIED
- 主包
@XmlSchema
注释的命名空间值错误(wasurn:stackoverflow:exportnamespace
而不是urn:stackoverflow:documentnamespace
,其中应包含文档
元素)
jdk\u jaxb/UnmarshallerTest.java导入错误-导入的是model.eclipselink.Document
,而不是model.sun.Document
编辑:这是更新的代码
好的,这是所有moxy_jaxb测试都通过的工作版本。因为您说您正在使用moxy,所以我忽略了model.sun.*包的更改。如果您理解下面的概念,您应该能够自己轻松地修复它
首先,我在您的模式中清理了名称空间声明。*包。大多数情况下,package-info.java中的声明和绑定就足够了。在包、实体和字段上反复声明它们将增加复杂性和不必要的行为。查看详细信息。无需在单个模型/实体本身上重新声明它们,除非有充分理由这样做。接下来,测试xml本身有点破损。修复了在必要时使用适当前缀的测试xml:
首先,model.eclipselink.Document.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "document")
public class Document {
@XmlElement(name = "Export", namespace="urn:adcubum:Syrius")
private Export export;
public Export getExport() {
return export;
}
public void setExport(Export export) {
this.export = export;
}
}
model.eclipseelink.package-info.java:
@XmlSchema(namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx",
elementFormDefault = XmlNsForm.QUALIFIED)
package model.eclipselink;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
@XmlSchema(namespace = "urn:adcubum:Syrius",
elementFormDefault = XmlNsForm.QUALIFIED)
package model.eclipselink.export;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.Xml
model.eclipselink.export.packageinfo.java上的类似重构:
@XmlSchema(namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx",
elementFormDefault = XmlNsForm.QUALIFIED)
package model.eclipselink;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
@XmlSchema(namespace = "urn:adcubum:Syrius",
elementFormDefault = XmlNsForm.QUALIFIED)
package model.eclipselink.export;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.Xml
在Export.java上:
package model.eclipselink.export;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlElementNillable;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Export")
@XmlType(name = "Export", propOrder = {
"exportInhalt",
"exportKopf",
"schemaVersion"
})
public class Export {
@XmlElement(name = "ExportKopf", required = true)
private ExportKopf exportKopf;
@XmlElement(name = "ExportInhalt", required = true)
private ExportInhalt exportInhalt;
@XmlElement(name = "SchemaVersion", required = true)
private String schemaVersion;
public ExportKopf getExportKopf() {
return exportKopf;
}
public void setExportKopf(ExportKopf exportKopf) {
this.exportKopf = exportKopf;
}
public ExportInhalt getExportInhalt() {
return exportInhalt;
}
public void setExportInhalt(ExportInhalt exportInhalt) {
this.exportInhalt = exportInhalt;
}
public String getSchemaVersion() {
return schemaVersion;
}
public void setSchemaVersion(String schemaVersion) {
this.schemaVersion = schemaVersion;
}
}
还有对xml文件前缀的一些调整
<?xml version="1.0" encoding="UTF-8"?>
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx">
<ns1:Export xmlns:ns1="urn:adcubum:Syrius">
<ns1:ExportKopf>
<ns1:Quelle>lokal</ns1:Quelle>
</ns1:ExportKopf>
<ns1:ExportInhalt/>
<ns1:SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</ns1:SchemaVersion>
</ns1:Export>
</for:document>
洛卡尔
bec811a9807a8c8da403d70b9b5e22ad
document.xml:
<?xml version="1.0" encoding="UTF-8"?>
<for:document
xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx" xmlns="urn:adcubum:Syrius">
<Export>
<ExportKopf>
<Quelle>lokal</Quelle>
</ExportKopf>
<ExportInhalt />
<SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion>
</Export>
</for:document>
洛卡尔
bec811a9807a8c8da403d70b9b5e22ad
和文档_realmespace.xml(不确定此文件的用途):
洛卡尔
bec811a9807a8c8da403d70b9b5e22ad
然后运行mvn清洁测试:
Running moxy_jaxb.MarshallerTest
Context class: class org.eclipse.persistence.jaxb.JAXBContext
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrend
erer/forwktbx" xmlns:ns0="urn:adcubum:Syrius">
<ns0:Export>
<ns0:ExportInhalt/>
<ns0:ExportKopf>
<ns0:Quelle>lokal</ns0:Quelle>
</ns0:ExportKopf>
<ns0:SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</ns0:SchemaVersion>
</ns0:Export>
</document>
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 sec
Running moxy_jaxb.UnmarshallerTest
Context class: class org.eclipse.persistence.jaxb.JAXBContext
lokal
Context class: class org.eclipse.persistence.jaxb.JAXBContext
lokal
Context class: class org.eclipse.persistence.jaxb.JAXBContext
lokal
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 sec
运行moxy_jaxb.MarshallerTest
上下文类:类org.eclipse.persistence.jaxb.JAXBContext
洛卡尔
bec811a9807a8c8da403d70b9b5e22ad
测试运行:1,失败:0,错误:0,跳过:0,所用时间:0.044秒
运行moxy_jaxb.UnmarshallerTest
上下文类:类org.eclipse.persistence.jaxb.JAXBContext
洛卡尔
上下文类:类org.eclipse.persistence.jaxb.JAXBContext
洛卡尔
上下文类:类org.eclipse.persistence.jaxb.JAXBContext
洛卡尔
测试运行:3,失败:0,错误:0,跳过:0,所用时间:0.033秒
我也在github repo中修复了您的代码,提出了一个拉取请求,以便您可以找到它。这是我的克隆:这个问题可能会帮助您了解元素formdefault
的限定值与非限定值: