2011-11-01 9 views
5

Tôi có một số tệp XML được XStream lưu trữ trong một thời gian trước và chúng bao gồm tham chiếu đến RandomAccessSubList, một lớp không hiển thị ngoài cấp gói và không có hàm tạo mặc định để XStream ném lỗi này:XStream - unmarshalling - Loại được chỉ định trong XML không hiển thị

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

---- Debugging information ---- 
message    : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor 
cause-exception  : com.thoughtworks.xstream.converters.reflection.ObjectAccessException 
cause-message  : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor* 

và đây là XML:

<customTimes class="java.util.RandomAccessSubList"> 
    <l class="list"> 
    <long>1302174300146</long> 
    <long>1302174305231</long> 
    <long>1302174310312</long> 

, vv

tôi không thể chỉ cần viết một bộ chuyển đổi cho RandomAccessSubList becau nó không hiển thị bên ngoài gói util. Làm thế nào tôi có thể nói với XStream để bỏ qua các lớp học cho thuộc tính này hoặc làm thế nào tôi có thể chỉ định một công cụ chuyển đổi cho một lớp tôi không thể tham khảo?

Cảm ơn trước!

Trả lời

8

Tôi đã đến đáy của nó - hóa ra xstream sẽ xử lý xml đó (nó không cần một hàm tạo không có arg), vấn đề nảy sinh vì tôi đang sử dụng jdk 7 với phiên bản cũ hơn của xstream (1.3. 1). Xem tại đây http://code.google.com/p/pitestrunner/issues/detail?id=4. Quay lại jdk 6 đã khắc phục vấn đề (vì nhiều lý do khác nhau mà tôi không thể nâng cấp).

Trước khi tôi nhận ra rằng tôi đã viết một chuyển đổi mà làm việc cho RandomAccessSubList nếu có ai cần nó:

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; 
} 

Nhờ những ai đang tìm kiếm vào cho tôi!