XStream - unmarshalling - тип, указанный в XML, не отображается - PullRequest
5 голосов
/ 01 ноября 2011

У меня есть некоторые XML-файлы, хранящиеся в XStream некоторое время назад, и они включают ссылки на RandomAccessSubList, класс, который не виден за пределами уровня пакета и не имеет конструктора по умолчанию, поэтому XStream выдает эту ошибку:

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*

и это XML:

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

и т.д.

Я не могу просто написать конвертер для RandomAccessSubList, потому что он не виден вне пакета утилит. Как я могу сказать XStream игнорировать класс для этого атрибута или как я могу указать конвертер для класса, на который я не могу ссылаться?

Заранее спасибо!

1 Ответ

8 голосов
/ 02 ноября 2011

Я докопался до сути - оказалось, что xstream должен обрабатывать этот xml (ему не нужен конструктор без аргументов), проблема возникла из-за того, что я использовал jdk 7 со старой версией xstream (1.3.1).См. Здесь http://code.google.com/p/pitestrunner/issues/detail?id=4. Переход к jdk 6 исправил проблему (по разным причинам я не могу обновить).

Прежде чем я понял, что я написал конвертер, который работал для RandomAccessSubList, если кому-то это нужно:

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

Спасибо всем, кто искал меня!

...