今天工作中遇到了这个问题:
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,问题就解决了。
见老外的讨论: