Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';使用默认名称空间时,t解组封送的文档_Java_Xml_Jaxb_Eclipselink - Fatal编程技术网

Java Can';使用默认名称空间时,t解组封送的文档

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文档:

<?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
    注释的命名空间值错误(was
    urn: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
的限定值与非限定值: