XStream no-args constructor

 

今天工作中遇到了這個問題:

com.thoughtworks.xstream.converters.ConversionException: Cannot construct ClassXXX as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor

 

害得我跟我們同事忙活了一個下午才搞定

 

一般出現這個問題是因爲在使用XStream時,某些類沒有實現序列化,且又沒有空的構造器。這些類一般是第三方包中的,自己寫的類直接實現序列化或添加一個空的構造器就行了。

 

解決這個問題可以有兩種實現方式:

1. 使用Converter,把這個類的對象反序列化

例如:

 

public class RandomAccessSubListConverter extends CollectionConverter {

public RandomAccessSubListConverter(Mapper mapper) {
    super(mapper); 
} 

@Override
public boolean canConvert(Class arg0) {     
    return arg0.getName().equals("java.util.RandomAccessSubList");
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,
        UnmarshallingContext context) {        
    reader.moveDown();
    ArrayList arrayList = new ArrayList();
    populateCollection(reader, context, arrayList);
    reader.moveUp();
    return arrayList;
}

 

2. 可以升級JDK到6.XX版本以上,XStream就可以支持非序列化且沒有空構造器的類了。
 
 
今天遇到的這個問題的原因就是因爲JDK版本的問題造成的。
在WebLogic下,大多數人都喜歡用jrocket的JDK,因爲Oracle宣稱它是最快的JDK,但是oracle 11g自帶的JDK和XStream存在這個兼容問題。
 
我們換回了JDK 1.6.22,問題就解決了。
 
見老外的討論:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章