背景
最近接手了一个支付项目,该项目对接的第三方支付公司的接口报文是XML格式,项目中使用的是XStream 进行处理的。经过排查发现每个接口响应的报文格式是统一的。于是对响应体进行了封装。如下:
@Data
@XStreamAlias("ROOT")
public class CiticApiResponse<T extends CiticBaseResponseData> {
/**
* 平台应答码
*/
private String CODE;
/**
* 平台应答码描述
*/
private String MESSAGE;
/**
* 业务响应数据
*/
private T DATA;
public boolean isSuccess(){
if ("AAAAAAA".equals(CODE)){
return true;
}
return false;
}
}
但是在进行测试的时候,xml 反序列化的时候data的数据一直报错,T 被转化为了CiticBaseResponseData ,而这个类是一个父类,封装了一些公用的字段。报文中的元素不在这个公共类中就一直报错。后面查看相关文档,发现XStream默认是不支持泛型的,但是它提供了一个Converter转化接口。通过这个接口可以自己实现反序列化。这里我就是使用这种方式解决了我的问题。 下面是我实现的内容
实现
第一步:先定义CiticApiResponseConverter 实现Converter接口
package com.ksbl.pay.client.converter;
import com.ksbl.pay.client.resp.citic.CiticApiResponse;
import com.ksbl.pay.client.resp.citic.CiticBaseResponseData;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CiticApiResponseConverter<T extends CiticBaseResponseData> implements com.thoughtworks.xstream.converters.Converter {
private Class<T> aClass;
public CiticApiResponseConverter(Class<T> aClass) {
this.aClass = aClass;
}
@Override
public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) {
}
@Override
public CiticApiResponse<T> unmarshal