Reputation: 1
I'm receiving the following XML from a client:
<data>
<action>someAction</action> // actionX, actionY, and so forth...
<params>
<name>Some name</name>
<tel>1234567890</tel>
.
.
.
etc...
</params>
</data>
I created the following classes:
class Data<T> {
String action;
T params;
}
class ContentX {
String name;
String tel;
}
class ContentY {
String id;
String productDesc;
}
I need to transform the XML into Objects, using the Data class. Depending on the action, i need to map the T attribute to a specific class, like ContentX or ContentY.
I already tried this, as an example, but it didn't work:
Data<ContentX> data = (Data<ContentX>) xstream.fromXML(XML);
I' getting the following exception:
Exception in thread "main" com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field java.lang.Object.name
---- Debugging information ----
field : name
class : java.lang.Object
required-type : java.lang.Object
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path : /data/params/name
line number : 1
class[1] : com.xstream.xml.Data
version : null
-------------------------------
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:453)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:294)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1058)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1042)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:913)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:904)
Upvotes: 0
Views: 3754
Reputation: 21
XStream xstream = new XStream();
Data<ContentX> data = new Data<ContentX>();
data.action="push";
data.params=new ContentX();
data.params.name="where";
data.params.tel="1712";
xstream.alias("data", Data.class);
xstream.alias("params", ContentX.class);
String xml = xstream.toXML(data);
System.out.println(xml);
Data<ContentX> result = (Data<ContentX>)xstream.fromXML(xml);
System.out.println(result.action);
System.out.println(result.params.name);
System.out.println(result.params.tel);
Upvotes: 2