3

我使用 moxy 为不同的 xsd 文件生成代码: http ://www.forum-datenaustausch.ch/generalinvoiceresponse_400.xsd 和 http://www.forum-datenaustausch.ch/xmlstandards_generelle_rechnung_beispiele_antwort_4.3_20100901.zip

我为两个 xsd 生成了 jaxb 类(使用 moxy)。然后我尝试使用以下代码解组 xml 文件(由 eclipse 生成):

public void tempTest() throws JAXBException{
    JAXBContext jC = JAXBContext.newInstance(<package for corresponding type>.ResponseType.class);
    jC.createUnmarshaller().unmarshal(ResponseTest.class.getResourceAsStream("/responses/generalInvoiceResponse_400.xml"));
}

使用 4.3 类型的 xml 文件(第 2 个链接)可以正常工作,但使用 400 类型的 xml(第 1 个链接)我收到此错误:

Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element {http://www.forum-datenaustausch.ch/de}response was not found in the project]

这似乎是名称空间的问题。命名空间不同,但我看不到生成的代码或生成的 xml 的相关差异 - 命名空间是一致的。那么什么可能导致这个问题(区别在哪里)以及如何解决它?

小补充:我还尝试解组使用 jaxb/moxy-code 编组的 xml:

public void marshall() throws JAXBException, FileNotFoundException {
    JAXBContext jC = JAXBContext.newInstance(ResponseType.class);
    ObjectFactory of = new ObjectFactory();
    jC.createMarshaller().marshal( of.createResponse(of.createResponseType()),new FileOutputStream("simpleresponse.xml"));
}

这将创建一个非常简单的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<response xmlns="http://www.forum-datenaustausch.ch/de"/>

解组这会产生相同的错误

4

2 回答 2

2

JAXBContext基于从 XML 模式生成的模型创建一个时,您应该始终使用newInstance采用包名称的方法。这将确保处理所有必要的位。

JAXBContext jC = JAXBContext.newInstance("ch.forum_datenaustausch.de");

当您使用该JAXBContext.newInstance(Class...)方法时,JAXB 实现假定您从 Jav 类开始。由于ObjectFactory可以由任何使用从 XML 模式生成的类进行注释@XmlRegistryObjectFactory类来扮演角色,因此将被自动拾取。您可以执行以下操作,但我仍然推荐上述方法:

JAXBContext jC = JAXBContext.newInstance(ResponseType.class, ObjectFactory.class);

更新

谢谢!但是您能解释一下为什么它与一个 xsd 一起工作而不与另一个一起工作吗?

它“工作”的模式可能有一个具有匿名类型的全局元素,这会导致@XmlRootElement生成注释,这意味着ObjectFactory不需要。另一个可能有一个具有命名复杂类型的全局元素,这会导致生成类@XmlElementDecl上的注释。ObjectFactory

于 2013-05-21T14:51:03.197 回答
0

我在 WebLogic 12 上也收到了相同的错误消息,但问题是由于命名空间前缀。在 @Xmlrootelement(name="namespace:root tag name") 中显式添加名称空间后,它得到了修复

于 2015-03-11T18:42:52.100 回答