2014-05-23 103 views
1

如果沒有package-info.java文件,JAXB unmarshaller會拋出異常。此代碼是從另一種語言調用的,自定義類加載器無法正確加載package-info。JAXB unmarshall xml without package-info.java

我已經手動添加名稱空間參數給所有的@XmlElement註解。

Xml根元素具有多個xmlns屬性。其中兩個(xmlns和xmlns:c)具有相同的值(我無法更改xml,它來自外部服務)

但是:如果從文檔中刪除xmlns =「urn:foo:bar」即使沒有包信息

問題:如何在沒有包信息的情況下取消組裝(我無法修改無法加載的自定義類加載程序),也無需從xml中刪除xmlns? 我應該在我的代碼中更改什麼?

爪哇1.6_45 vJAXB 2.1.10

XML根元素樣品:

<?xml-stylesheet type="text/xsl" href="file1.xslt"> 
<?xml-stylesheet type="text/xsl" href="file1.xslt"?> 
<c:ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:foo:ba" xmlns:c="urn:foo:bar" xmlns:std="urn:foo:std" 
xsi:schemaLocation="urn:foo:bar file2.xsd"> 

代碼:

String path = "D:\\data\\document.xml"; 

    try { 
     JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class); 
     Unmarshaller u = jc.createUnmarshaller(); 
     Object root = u.unmarshal(new File(path)); //exception w/o package-info.java 

     CDocument doc= (CDocument) JAXBIntrospector.getValue(root); 
     System.out.println(doc); 

package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:foo:bar", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, 
    xmlns={@XmlNs(namespaceURI = "urn:foo:bar", prefix = "")}) 
package test.model; 

    import javax.xml.bind.annotation.XmlNs; 

例外:

javax.xml.bind.UnmarshalException: Unable to create an instance of my.package.here.model.ANY 

任何想法將不勝感激,我花了這麼多時間嘗試,但仍然沒有。

回答

0
BUT: It works if I remove xmlns="urn:foo:bar" from document even without package-info 

這意味着您尚未在需要的地方添加namespace參數。

在下面的XML文檔,而不@XmlSchema註釋映射命名空間的資格,您將需要在@XmlRootElement標註爲Foo類和@XmlElement註釋上bar屬性namespace參數。

<foo xmlns="http://www.example.com"> 
    <bar>Hello World</bar> 
</foo>