【问题标题】:XStream : duplicate field exceptionXStream:重复字段异常
【发布时间】:2013-08-23 17:03:52
【问题描述】:
<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 类:

@XStreamAlias("stage")
public class Stage {

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

我正在使用 XStream 1.4.2 将该 XML 数据转换为 Java 对象。

我看过几个 SO 帖子,但仍然没有解决我的问题。

它抛出以下异常:

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

虽然它没有抛出任何异常,但它无法读取值,每个元素都有。

你能帮帮我吗?

【问题讨论】:

    标签: java xml xml-parsing xstream


    【解决方案1】:

    答案就在调试信息中

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

    更新:

    看着这个answer 我觉得你漏掉了一些注释

        @XStreamAlias("stage")
        public class Stage {
    
        private String name;
    
        @XStreamImplicit(itemFieldName="taskName")
        private List<String> tasks;
    
        @XStreamImplicit(itemFieldName="iconName")
        private List<String> icons;
        }
    

    【讨论】:

    • 谢谢,但不是因为这个原因。它试图说你有第二个同名元素,即taskName。我的项目中的实际值不同,但仍然显示相同的异常。
    • 我认为这不是元素名称,而是元素内部的值&lt;taskname&gt; - 元素qwe - 值为什么不尝试更改第二个&lt;taskname&gt; 的值?
    • Rakesh,我已经告诉过你,我在我的项目中尝试了不同的值,它抛出了相同的异常。
    • 噢!是的,它有效。我试过@XStreamImplicit 没有提供itemFieldName="taskName"。谢谢
    【解决方案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.       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多