2012-12-07 71 views
2

我收到以下設置的XStream錯誤。我一定是瘋了。怎麼了?XStream類無法解析

請求類

@XStreamAlias("RequestTO") 
public class RequestTO { 

    @XStreamImplicit 
    private List<SkuMerchTO> skuNumbers; 
... 
} 

嵌套對象類

@XStreamAlias("skuMerch") 
public class SkuMerchTO { 

    @XStreamAlias("skuNumber") 
    @XStreamAsAttribute 
    private Integer skuNumber; 

    @XStreamAlias("dept") 
    @XStreamAsAttribute 
    private Short department; 

    @XStreamAlias("class") 
    @XStreamAsAttribute 
    private Short cls; 

    @XStreamAlias("subClass") 
    @XStreamAsAttribute 
    private Short subClass; 
... 
} 

XStream的代碼的XML解碼爲一個對象:

XStream stream = new XStream(); 
stream.processAnnotations(SkuMerchTO.class); 
stream.processAnnotations(RequestTO.class); 
RequestTO request = (RequestTO)stream.fromXML(requestXml); 

XML輸入字符串:

<RequestTO> 
    <skuMerch skuNumber="123456" dept="1" class="2" subClass="3"/> 
    <skuMerch skuNumber="234567" dept="4" class="5" subClass="6"/> 
</RequestTO> 

錯誤在堆棧跟蹤:
----調試信息----
消息:2:2
原因的異常:com.thoughtworks.xstream.mapper.CannotResolveClassException
原因的消息:2:2
類:[...] RequestTO
需要型:[...] SkuMerchTO
路徑:/ RequestTO/skuNumberList/skuMerch
行號:3
.--------- ----------------------
com.thoughtworks.xstream.converters.ConversionException:2:2:2:2
----調試信息----
消息:2:2
原因的異常:com.thoughtworks.xstream.mapper .CannotResolveClassException
原因的消息:2:2
類:[...] RequestTO
需要型:[..] SkuMerchTO
路徑:/ RequestTO/skuNumberList/skuMerch
行號:3
.-------------------------------

如果我創建對象,toxml用於做我得到這個:

<RequestTO> 
    <skuMerch skuNumber="0" dept="1" class="2" subClass="2"/> 
    <skuMerch skuNumber="1" dept="1" class="2" subClass="2"/> 
    <skuMerch skuNumber="2" dept="1" class="2" subClass="2"/> 
</RequestTO> 

編輯:熱鬧的事情是,如果做到這一點:

stream.fromXML(stream.toXML(object)); 

它仍然無法在從XML的一部分!

+0

我不明白輸出的XML如果你有別名'RequestTo'到'Request' ... – mre

+0

我的壞註釋,這是一個錯字。別名是「RequestTO」 – pclem12

+0

我輸入驗證碼(幾乎)直接,或從使用的XStream 1.4.2 XML沒有遇到任何問題。你正在使用哪個版本?不過,我確實爲類創建了一個包。 – cmonkey

回答

3

命名class屬性具有特殊意義的XStream,this question建議你可以告訴XStream的通過一些使用不同的屬性,爲此,像

stream.aliasSystemAttribute("__class", "class"); 

這將導致XStream的使用__class作爲「特殊「屬性,並將class視爲正常的屬性。或者,如果你知道你不需要爲你的任何物體的XStream的魔法處理的class你可以說

stream.aliasSystemAttribute(null, "class"); 

告訴它沒有在所有使用此功能。

根據XStream annotation tutorial,您可能還需要在@XStreamImplicit註釋上使用itemFieldName="skuMerch"

+0

是的,就是這樣。不喜歡「班級」作爲別名。 24小時後,我會給你你的賞金。謝謝! – pclem12