2013-01-04 140 views
3

当反序列化Xml时,我遇到了java泛型和xstream的问题。仿制药和Xstream

这是主要的DTO

@XStreamAlias("OBJECTX") 
public class ObjectX<T> { 

    @XStreamAlias("DATA") 
    private T t; 

    ... getter and setter ... 

} 

这是主要的DTO

@XStreamAlias("DATA") 
public class FolderXml { 

    @XStreamAlias("DIGITION_NAME") 
    private String digitionName; 

    @XStreamAlias("FOLDER_ID") 
    private int folderId; 

    ...getters and setters... 

} 

内的数据对象时,此是XML实例反序列化

<?xml version="1.0" encoding="UTF-8"?> 
<OBJECTX> 
     <DATA> 
      <DIGITION_NAME>TVC_ACT2</DIGITION_NAME> 
      <FOLDER_ID>1234</FOLDER_ID> 
     </DATA> 
</OBJECTX> 

这是实际的代码

StaxDriver staxDriver = new StaxDriver(new NoNameCoder()); 
XStream xstream = new XStream(staxDriver); 
xstream.processAnnotations(ObjectX.class); 
xstream.alias("DATA", FolderXml.class); 
ObjectX<FolderXml> obj= (ObjectX<FolderXml>) xstream.fromXML(xml); 

唯一的例外是

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field java.lang.Object.DIGITION_NAME 
---- Debugging information ---- 
field    : DIGITION_NAME 
class    : java.lang.Object 
required-type  : java.lang.Object 
converter-type  : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
path    : /OBJECTX/DATA/DIGITION_NAME 
line number   : 4 
class[1]   : cat.ccma.digition.digitionservicecontroller.objects.base.ObjectX 
version    : null 
------------------------------- 

回答

0

修改代码以添加默认实施仿制药。

StaxDriver staxDriver = new StaxDriver(new NoNameCoder()); 
    XStream xstream = new XStream(staxDriver); 
    xstream.processAnnotations(ObjectX.class); 
    xstream.processAnnotations(FolderXml.class); 
    xstream.alias("DATA", FolderXml.class); 
    xstream.addDefaultImplementation(FolderXml.class,ObjectX.class.getDeclaredField("t").getType()); 
    ObjectX<FolderXml> obj= (ObjectX<FolderXml>) xstream.fromXML(xml);