2011-11-01 16 views
5

Tengo algunos archivos XML almacenados por XStream hace un tiempo, e incluyen referencias a RandomAccessSubList, una clase que no es visible más allá del nivel de paquete y no tiene un constructor predeterminado por lo que XStream arroja este error:XStream - desemparejamiento - Tipo especificado en XML no visible

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* 

y este es el XML:

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

etc.

que no puedo acaba de escribir un convertidor para RandomAccessSubList becau se no es visible fuera del paquete util. ¿Cómo puedo decirle a XStream que ignore la clase de este atributo o cómo puedo especificar un convertidor para una clase a la que no puedo hacer referencia?

¡Gracias de antemano!

Respuesta

8

Llegué al final - resulta que xstream debe manejar ese xml (no necesita un constructor sin argumentos), el problema surgió porque estaba usando jdk 7 con una versión anterior de xstream (1.3. 1). Vea aquí http://code.google.com/p/pitestrunner/issues/detail?id=4. Volver a jdk 6 solucionó el problema (por diversas razones no puedo actualizar).

Antes de que me di cuenta de que he escrito un convertidor que trabajó para RandomAccessSubList si alguien lo necesita:

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

Gracias a cualquier persona que estaba investigando para mí!

Cuestiones relacionadas