1

Xstream を使用して XML ファイルから読み取ろうとしています。私が抱えている奇妙な問題は、ユーザーのリストを作成すると、最初のユーザーを正しく読み取りますが、 2 番目のユーザーを最初の!のメンバー変数として保存しようとすることです。私はこの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>

Xstream リーダーのコード:

XStream xstream = new XStream(new StaxDriver());
xstream.addImplicitCollection(Model.class, "users", User.class);

@SuppressWarnings("rawtypes")
Class[] classes = new Class[2];
classes[0] = Model.class;
classes[1] = User.class;
xstream.processAnnotations(classes);

String xml = "";//The XML is really stored here, and it does work correctly
xstream.fromXML(xml);

そしてクラス自体。モデル:

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

例外(許してください-ANT[java]を使用して実行されています):

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

Xstream が 2 番目Userを最初の変数として格納しようとするのはなぜUserですか?

回答の編集: 2 つの問題があり、どちらもマイケルの回答で対処されています。

users1) XML は明示的にリストを宣言するため、暗黙のコレクション (2 回!) を暗示していましたが、これは行うべきではありませんでした。

2) クラス内の私の変数Modelは静的でした。これがなぜエラーを引き起こしたのかは不明ですが、それにもかかわらずエラーが発生しました。

4

1 に答える 1

3

ユーザー リストの前の@XStreamImplicit注釈は、XML にはユーザーを呼び出すタグはなく、代わりにユーザーと呼ばれるすべてのタグをユーザー リストに格納する必要があることを XStream に伝えます。

usersXML から削除するか@XStreamImplicit、変数宣言から注釈を削除してください。

追加の変更 への呼び出しも削除する必要がありxstream.addImplicitCollection(Model.class, "users", User.class);ます@XStreamImplicit

暗黙の修正後に発生する他の問題は、Model クラスのユーザー変数が static と宣言されていることが原因です。これは静的であるため、シリアライゼーションの一部として扱われません。

于 2013-11-07T19:07:40.300 に答える