2017-09-12 53 views
0

這似乎是一個基本問題,但我無法在別處找到答案。如果這是一個重複的帖子,請原諒我。JAXB - 將@xmlvalue與令牌字段一起使用

是否有可能在標記爲@XmlAccessorType(XmlAccessType.FIELD)的類上有@XmlValue註解?

我試圖解析與JAXB XML文件,而XML本身是相當大的,但有其他領域,問題是具體到本場:

<root> 
    ... 
    <holiday holidayId="9">Christmas</holiday> 
    ... 
</root> 

的映射是:

public class Holiday extends Model { 
    @XmlAttribute(name="holidayId") 
    private String holidayId; 
    @XmlValue 
    private String holiday; 
} 

該字段在XML中被聲明爲令牌類型。

@XmlValue註釋給我一個IllegalAnnotationException(如果我註釋@XmlValue和假期字段,映射工作正常)。爲什麼這會失敗?什麼是解決方法?請指教。

+0

什麼是模型?你能分享整個班級和xml嗎? – muasif80

+0

如果你分享整個XML和類,那麼我們可以詳細研究它。 – muasif80

+0

模型是一個相當基礎的類。只需提供諸如使用GSON將整個對象轉換爲JSON的便捷方法。不幸的是,由於機密性原因,我無法共享整個XML,但我已經評論了對@XmlValue的引用併成功解析了整個XML。解析失敗的唯一時間是當我有一個特定字段的類試圖訪問它的值,如上所示。 – user1452030

回答

0

是的,它應該沒有問題。我用這些類:

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    @XmlElement(name = "holiday") 
    List<Holiday> holidays; 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Holiday { 

    @XmlAttribute(name="holidayId") 
    private String holidayId; 

    @XmlValue 
    private String holiday; 
} 

對我來說,它工作得很好。我將您的XML示例輸入與此測試代碼一起使用:

JAXBContext context = JAXBContext.newInstance(Root.class); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
File file = new File("root.xml"); 
Root root = (Root) unmarshaller.unmarshal(file); 

Marshaller marshaller = context.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(root, System.out); 
+0

感謝您的確認。有趣的是,當我嘗試使用具有不同元素的相同配置(在XSD類型def中聲明爲String)時,代碼工作正常。看起來在使用類型爲token的字段時使用@XmlValue註解存在一些限制。 – user1452030

+0

@ user1452030是的,'@ XmlValue'有一些限制。例如:*如果一個類具有'@ XmlElement'屬性,則它不能具有'@ XmlValue'屬性。*您需要發佈確切的異常消息和Java類。 –