Я пытаюсь использовать XStream для десериализации ответа xml на класс, имеющий поле универсального типа.
Например, у меня есть класс Ответ
class Response<T extends BaseDTO>{
int id;
T field;
public int getId(){
return id;
}
public T getField(){
return field;
}
}
class B extends BaseDTO{}
class C extends BaseDTO{}
public abstract class XStreamFactory{
public static <T extends BaseDTO> XStream initXStream(Class<T> c){
XStream xstream = new XStream(new DomDriver());
xstream.alias("response-root", Response.class);
if(c.equals(B.class)){
xstream.alias("specific-response-b", B.class);
else
xstream.alias("specific-response-c", C.class);
xstream = addAliases(xstream, c);
return xstream;
}
// we want to process the annotations declared on type c
protected static XStream addAliases(XStream xstream, Class<?> c){
while (c != null) {
xstream.processAnnotations(c);
c = c.getSuperclass();
}
return xstream;
}
}
Для десериализации ответа я делаю следующее:
XStream xstream = XStreamFactory.initializeXStream(B.class);
Response<B> resp = (Response<B>) xstream.fromXML(response);
Ниже приведены xml-ответы, которые я получаю:
<response-root>
<id></id>
<specific-response-b>
//... content specific for class B
</specific-response-b>
</response-root>
или
<response-root>
<id></id>
<specific-response-c>
//... content specific for class c
</specific-response-c>
</response-root>
Кодвыше не десериализовать ответ.Выдает следующее исключение:
com.thoughtworks.xstream.converters.ConversionException: Element specific-response-b of type B is not defined as field in type Response
Можете ли вы, ребята, дать какие-либо указания о том, как добиться того, чего я хочу?Спасибо.