2013-01-04 2 views
3

Xml을 deserialize 할 때 Java generics 및 xstream에 문제가 있습니다. 이 메인 DTO이다Generics 및 Xstream

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

    @XStreamAlias("DATA") 
    private T t; 

    ... getter and setter ... 

} 

이것은이 실제이다 이것은 XML 예제가

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

직렬화되는 메인 DTO

@XStreamAlias("DATA") 
public class FolderXml { 

    @XStreamAlias("DIGITION_NAME") 
    private String digitionName; 

    @XStreamAlias("FOLDER_ID") 
    private int folderId; 

    ...getters and setters... 

} 

내부 데이터 객체이고 코드

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