2011-11-01 11 views
5

Ho alcuni file XML archiviati da XStream un po 'di tempo fa e includono riferimenti a RandomAccessSubList, una classe che non è visibile oltre il livello di pacchetto e non ha un costruttore predefinito quindi XStream genera questo errore:XStream - unmarshalling - Tipo specificato in XML non visibile

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* 

e questo è l'XML:

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

ecc

non posso scrivere un convertitore per RandomAccessSubList becau se non è visibile al di fuori del pacchetto util. Come posso dire a XStream di ignorare la classe per questo attributo o come posso specificare un convertitore per una classe a cui non posso fare riferimento?

Grazie in anticipo!

risposta

8

Sono arrivato fino in fondo - si scopre che xstream deve gestire quel xml (non ha bisogno di un costruttore no-args), il problema è sorto perché stavo usando jdk 7 con una versione precedente di xstream (1.3. 1). Vedi qui http://code.google.com/p/pitestrunner/issues/detail?id=4. Tornando a jdk 6 risolto il problema (per vari motivi non posso aggiornare).

Prima mi sono reso conto che ho fatto scrivere un convertitore che ha lavorato per RandomAccessSubList se qualcuno ne ha bisogno:

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

Grazie a tutti coloro che stava indagando per me!

Problemi correlati