2014-10-02 73 views
0

我從xml模式生成java類,對於一個複雜類型,我希望jaxb使用現有類,爲此我有一個外部綁定自定義文件。 自定義類被解組爲,除了以外,該類型的單個屬性永遠不會填充到java類中。JAXB未將屬性映射到「自定義」類

下面是類型/類Thing的問題演示。

如在模式中定義的事情是:

<xsd:complexType name="Thing"> 
    <xsd:sequence> 
    <xsd:element name="nameEl" type="xsd:string"/> 
    </xsd:sequence> 
    <xsd:attribute name="nameAttr" type="xsd:string" use="required"/> 
</xsd:complexType> 

和讀取匹配xml文件是片段:

JAXBContext jc = JAXBContext.newInstance("jaxbtest"); 
Unmarshaller u = jc.createUnmarshaller(); 

// Make it validate against the instance schema 
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(new File("./sample.xsd")); 
u.setSchema(schema); 

Config config = (Config)u.unmarshal(new File("./sample.xml")); 

for (Thing thing : config.getThing()) { 
    System.out.println("nameAttr=[" + thing.getNameAttr() +"]"); 
    System.out.println("nameEl=[" + thing.getNameEl() +"]"); 
} 

閱讀在此xml:

<m:config xmlns:m="test"> 
    <thing nameAttr="hello"> 
    <nameEl>goodbye</nameEl> 
    </thing> 
</m:config> 

使用由JAXB生成的Thing類(不使用自定義xjb),輸出如預期的那樣:

nameAttr=[hello] 
nameEl=[goodbye] 

使用它只是有干將& setter方法nameAttr & nameEl自定義事類,輸出

nameAttr=[null] 
nameEl=[goodbye] 

自定義類很簡單:

public class Thing { 
    private String nameEl; 
    private String nameAttr; 

    public String getNameEl() { 
     return nameEl; 
    } 
    public void setNameEl(String value) { 
     this.nameEl = value; 
    } 

    public String getNameAttr() { 
     return nameAttr; 
    } 
    public void setNameAttr(String value) { 
     this.nameAttr = value; 
    } 
} 

任何人都可以解釋爲什麼「nameEL」元素和「nameAttr」屬性的行爲是不同的?

將自定義Thing與JAXB生成的東西進行比較唯一的區別是註釋,當不從Java類生成模式時,我認爲這不是必需的,並且顯然不適用於包含的元素。

爲了完整起見,XJB是:

<jxb:bindings 
    version="2.1" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"> 

    <jxb:bindings schemaLocation="sample.xsd"> 

    <jxb:bindings node="//xsd:complexType[@name='Thing']"> 
     <jxb:package name=""/> 
     <jxb:class ref="custom.Thing"/> 
    </jxb:bindings> 

    </jxb:bindings> 
</jxb:bindings> 

回答

0

嗯,你要真正去null的屬性,而不是元素。

我的猜測是問題很簡單。註釋很重要:如果您不提供它們,那麼您的屬性將被視爲@XmlElement - 默認情況下已註釋。這就是爲什麼一個財產沒有組織,另一個不是。

但是,如上所述,實際上您應該獲得null的屬性,而不是元素。你能重新檢查嗎?

這是布萊斯的relevant post

+0

這是我得到null的屬性。 你說得對,將註釋添加到自定義類中並沒有什麼用。 – bwldrd 2014-10-04 12:33:56

+0

我誤解了xsd-> java類生成映射的本質:我認爲在.xjb中定義映射的重點將避免編輯xsd或目標自定義java類,這兩者都不需要了解其他,即。良好的解耦。出於興趣,是否有另外一種實現映射到自定義類的機制?這是適配器嗎? 聚苯乙烯 - 謝謝你麻煩回答我原來的問題。 – bwldrd 2014-10-04 12:38:15

相關問題