2012-04-26 126 views
2

我正在使用eclipselink-2.3.2。我的包被註解:XmlDiscriminatorNode,XmlSchema命名空間和elementFormDefault = QUALIFIED

@XmlSchema(namespace = "http://example.com/namespace", elementFormDefault = XmlNsForm.QUALIFIED)

我有以下類別:

@XmlRootElement 
public class Box { 
    private A item; // and getter/setter 
} 

@XmlDiscriminatorNode("@thetype") 
public abstract class A {} 

@XmlDiscriminatorValue("b") 
public class B extends A {} 

@XmlDiscriminatorValue("c") 
public class C extends A {} 

當我嘗試反序列化有效的XML是這樣的:

<box xmlns="http://example.com/namespace"><a thetype="b" /></box>

我得到的描述例外:

org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: Missing class indicator field from database row [UnmarshalRecord()] 

如果我從包中刪除@XmlSchema,並從根元素中刪除xmlns屬性,它將起作用。如果我從QUALIFIED更改爲UNQUALIFIED,只要我給它添加醜陋的前綴XML,它就會工作。

我認爲前綴無效,因爲它仍然聲明瞭默認名稱空間,但雖然沒有例外,但該字段仍爲空。

步進EclipseLink代碼後,我看到當QNameInheritancePolicy.classFromRow調用UnmarshalRecord.get時,它試圖訪問namespaceURI「http://example.com/namespace」下的屬性「thetype」。

當我將XmlScehma elementFormDefault更改爲UNQUALIFIED時,namespaceURI返回null並且正確檢索屬性。

回答

2

這是EclipseLink JAXB (MOXy)中的一個錯誤。您可以使用下面的鏈接跟蹤我們在這個問題上的進展情況。我已經修復了這個bug,我會在測試用例完成運行後檢查它。

UPDATE

此bug已得到修復。您可以通過獲得的EclipseLink 2.4.0的一個嘗試,每晚構建起二零一二年四月三十零日:

+0

好極了,它現在可以爲我們工作了。感謝您指出了這一點! – 2012-05-02 12:07:52

+0

一個奇怪的是,之前我們有一個屬性存儲了我們用作@XmlDiscriminatorNode的枚舉的值,並且當屬性和註釋都指定了相同的名稱時,該屬性在XML中出現兩次,導致XML解析器barf 。我希望當類加載到JAXBContext中時我們會得到一個異常。 – 2012-05-02 17:25:51

1

你的鑑別是一個屬性,所以我覺得你只需要添加一個「@」:

@XmlDiscriminatorNode("@thetype") 
public abstract class A {} 

blog post by Blaise Doughan包含一些更多的信息和示例。

+0

對不起;這是我想出一個人爲的例子的錯。我編輯了這個問題。 – 2012-04-27 00:09:13

+0

(實際上,那篇博客文章就是我轉載的情況,除了我添加XmlSchema時開始出現問題) – 2012-04-27 16:33:39