Java Xstream错误地将列表项解释为另一个列表项的一部分

Java Xstream错误地将列表项解释为另一个列表项的一部分,java,list,xstream,Java,List,Xstream,我正在尝试使用Xstream读取XML文件。我遇到的一个奇怪的问题是,当我创建一个用户列表时,它会正确地读取第一个用户,但它会尝试将第二个用户存储为第一个用户的成员变量!我有一个XML文件: <data> <users> <user> <username>test1</username> <password>test1</password>

我正在尝试使用Xstream读取XML文件。我遇到的一个奇怪的问题是,当我创建一个用户列表时,它会正确地读取第一个用户,但它会尝试将第二个用户存储为第一个用户的成员变量!我有一个XML文件:

<data>
    <users>
        <user>
            <username>test1</username>
            <password>test1</password>
            <firstname>Test</firstname>
            <lastname>One</lastname>
            <email>test1@gmail.com</email>
            <indexedrecords>0</indexedrecords>
        </user>
        <user>
            <username>test2</username>
            <password>test2</password>
            <firstname>Test</firstname>
            <lastname>Two</lastname>
            <email>test2@gmail.com</email>
            <indexedrecords>0</indexedrecords>
        </user>
    </users>
    .... There are other tags here, but they're not causing an issue (yet).
</data>
还有班级本身。型号:

@XStreamAlias("data")
public class Model {
    @XStreamImplicit
    public static List<User> users;
    //Other stuff
}
exeption(请原谅
[java]
-它正在使用ANT运行):

为什么Xstream试图将第二个
用户
作为变量存储在第一个
用户

答案编辑:有两个问题,这两个问题都在Michael的答案中得到了解决

1) 我暗示了一个隐式集合(两次!),我不应该这样做,因为XML显式声明了一个
users
列表


2) 我在
模型
类中的变量是静态的。尚不清楚这导致错误的原因,但它确实导致了错误。

用户列表之前的
@XStreamImplicit
注释告诉XStream,XML将不具有标记调用用户,而是所有名为user的标记都应存储在用户列表中

从XML中删除
用户
,或者从变量声明中删除
@XStreamImplicit
注释

其他变化 您还需要删除对
xstream.addImplicitCollection(Model.class,“users”,User.class)的调用@XStreamImplicit
类似


修复隐式后遇到的另一个问题是模型类中的users变量被声明为静态的。因为它是静态的,所以不被视为序列化的一部分。

那个XML示例正确吗?它似乎试图用“/user”(不带“s”)关闭开头的“users”标记。不,抱歉,真正的XML是正确的。我将更新帖子。XML超出了我的控制范围-它是在外部创建的。删除@XStreamImplicit会导致线程“main”com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException中出现新的错误-
异常:没有这样的字段indexer.shared.model.model.users
。这让我很困惑,因为
模型
中该列表的名称正是
用户
。更正:删除
添加的mplicitcollection
(或同时删除两者)完成了我上面提到的操作。删除
@XStreamImplicit
会引发与问题本身相同的错误。感谢您的解释。根本问题是隐式集合和变量是静态的。虽然它们最好是静态的,但我可以修复它,使它们不是静态的。谢谢(顺便说一句,谢谢你的语法正确!)
@XStreamAlias("data")
public class Model {
    @XStreamImplicit
    public static List<User> users;
    //Other stuff
}
@XStreamAlias("user")
public class User implements ModelItem{
    private String username;
    private String password;
    @XStreamAlias("firstname")
    private String firstName;
    @XStreamAlias("lastname")
    private String lastName;
    private String email;
    @XStreamAlias("indexedrecords")
    private int recordsIndexed;
}
 [java] Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: Element user of type shared.model.User is not defined as field in type shared.model.User
 [java] ---- Debugging information ----
 [java] class               : shared.model.User
 [java] required-type       : shared.model.User
 [java] converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
 [java] path                : /data/users/user
 [java] line number         : 19
 [java] class[1]            : indexer.shared.model.Model
 [java] version             : null
 [java] -------------------------------
 [java]     at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.writeValueToImplicitCollection(AbstractReflectionConverter.java:403)
 [java]     at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:334)
 [java]     at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
 [java]     at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
 [java]     at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:322)
 [java]     at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
 [java]     at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
 [java]     at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
 [java]     at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
 [java]     at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052)
 [java]     at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)
 [java]     at com.thoughtworks.xstream.XStream.fromXML(XStream.java:912)
 [java]     at com.thoughtworks.xstream.XStream.fromXML(XStream.java:903)
 [java]     at importer.Importer.importXml(Importer.java:77)
 [java]     at importer.Importer.main(Importer.java:45)