使用生成的代码解组时出错(moxy):“在项目中找不到具有默认根元素的描述符”

时间:2013-05-21 10:12:54

标签: java xml jaxb unmarshalling moxy

我使用moxy为不同的xsd-Files生成代码: http://www.forum-datenaustausch.ch/generalinvoiceresponse_400.xsdhttp://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"/>

解组会产生相同的错误

2 个答案:

答案 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”)