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 つの問題があり、どちらもマイケルの回答で対処されています。
users
1) XML は明示的にリストを宣言するため、暗黙のコレクション (2 回!) を暗示していましたが、これは行うべきではありませんでした。
2) クラス内の私の変数Model
は静的でした。これがなぜエラーを引き起こしたのかは不明ですが、それにもかかわらずエラーが発生しました。