2013-08-21 2 views
1
<staging> 
    <stage> 
     <name>aaaa</name> 
     <taskName>aa</taskName> 
     <taskName>qwqwse</taskName> 
     <taskName>qwe</taskName> 
     <iconName>asdad</iconName> 
     <iconName>dasd</iconName> 
    </stage> 

    <stage> 
     <name>dasda</name> 
     <taskName>asdak</taskName> 
     <taskName>dasdk1</taskName> 
     <taskName>dasdask2</taskName> 
     <iconName>dasdn</iconName> 
     <iconName>dasdcon</iconName> 
    </stage> 
</staging> 

И это мой Java класс:XStream: Дубликат исключение поля

@XStreamAlias("stage") 
public class Stage { 

private String name; 
private List<String> taskName; 
private List<String> iconName; 
} 

Я использую XStream 1.4.2 для преобразования XML, что данные в объект Java.

Я видел пару сообщений СО, но все же это не решает мою проблему.

Его метания следующее исключение:

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field taskName 
---- Debugging information ---- 
field    : taskName 
class    : com.thbs.soaconnect.model.configuration.Stage 
required-type  : com.thbs.soaconnect.model.configuration.Stage 
converter-type  :  com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
path    : /soaConnect/staging/stage/taskName[2] 
line number   : 28 
class[1]   : java.util.ArrayList 
converter-type[1] : com.thoughtworks.xstream.converters.collections.CollectionConverter 
class[2]   : com.thbs.soaconnect.model.configuration.Configuration 
version    : null 

Я попытался следующим образом, как было предложено много раньше:

xstream.addImplicitCollection(Stage.class,"taskName", String.class); 
xstream.addImplicitCollection(Stage.class,"iconName", String.class); 

Хотя это не кидает каких-либо исключений, но он не может прочитать значение, каждый элемент имеет.

Не могли бы вы помочь мне.

ответ

5

Ответ прямо в отладочной информации

Duplicate field taskName 
path    : /soaConnect/staging/stage/taskName[2] 

UPDATE:

Глядя на эту answer я думаю, вам не хватает некоторых аннотаций

@XStreamAlias("stage") 
    public class Stage { 

    private String name; 

    @XStreamImplicit(itemFieldName="taskName") 
    private List<String> tasks; 

    @XStreamImplicit(itemFieldName="iconName") 
    private List<String> icons; 
    } 
+0

Спасибо, но это не по этой причине. Он пытается сказать, что у вас есть второй элемент с тем же именем, то есть 'taskName'. Фактические значения в моем проекте разные, но при этом они показывают одно и то же исключение. – Joshi

+0

Я думаю, что это не имя элемента, это значение внутри элемента '' - element 'qwe' - value Почему бы вам не попробовать изменить значение второго' '? – Rakesh

+0

Rakesh, как я уже сказал, я пробовал с разными значениями здесь, в моем проекте, и он бросает то же исключение. – Joshi

2

У вас нет чтобы добавить что-либо внутри вашего класса Stage. Просто добавьте правильный псевдоним в свой класс Stage, а затем используйте addImplicitCollections.

XML Input : 
<stage> 
     <name>dasda</name> 
     <taskName>asdak</taskName> 
     <taskName>dasdk1</taskName> 
     <taskName>dasdask2</taskName> 
     <iconName>dasdn</iconName> 
     <iconName>dasdcon</iconName> 
</stage> 

Code for Stage Class : 
public class Stage { 

private String name; 
    private List<String> taskName; 
    private List<String> iconName; 
} 

Code to retrieve parse XML using xtream object : 
Xstream.alias("stage", Stage.class); 
Xstream.addImplicitCollection(Stage.class,"taskName",String.class); 
Xstream.addImplicitCollection(Stage.class,"iconName",String.class); 

It worked for me.