今天工作中遇到了這個問題:
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,問題就解決了。
見老外的討論: