我使用moxy为不同的xsd-Files生成代码: http://www.forum-datenaustausch.ch/generalinvoiceresponse_400.xsd 和 http://www.forum-datenaustausch.ch/xmlstandards_generelle_rechnung_beispiele_antwort_4.3_20100901.zip
我为两个xsd(使用moxy)生成了jaxb-classes。然后我用这段代码尝试了unmarshal 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-type(第二个链接)的xml-File,这个工作正常,但是xml为400-type(第一个链接)我得到这个错误:
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 marshaled:
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"/>
解组会产生相同的错误。
答案 0 :(得分:2)
根据从XML Schema生成的模型创建JAXBContext
时,应始终使用采用包名称的newInstance
方法。这将确保处理所有必要的位。
JAXBContext jC = JAXBContext.newInstance("ch.forum_datenaustausch.de");
当您使用JAXBContext.newInstance(Class...)
方法时,JAXB实现假定您是从Jav类开始的。由于任何使用ObjectFactory
注释的类都可以播放@XmlRegistry
的角色,因此将自动选取从XML架构生成的ObjectFactory
类。您可以执行以下操作,但我仍然建议使用上述方法:
JAXBContext jC = JAXBContext.newInstance(ResponseType.class, ObjectFactory.class);
<强>更新强>
谢谢!但你能解释一下为什么它与一个人合作 xsd而不是其他?
它“工作”的模式可能有一个带有匿名类型的全局元素,这会导致生成@XmlRootElement
注释,这意味着不需要ObjectFactory
。另一个可能有一个带有命名复杂类型的全局元素,这会导致生成@XmlElementDecl
类的ObjectFactory
注释。
答案 1 :(得分:0)
我在WebLogic 12上也收到了相同的错误消息,但问题是由于名称空间前缀。 在@Xmlrootelement中显式添加名称空间后得到修复(name =“namespace:root tag name”)