- 转换的 xml 格式*(其中 DataTable 节点下 a 、b 字段是 X 类,c 、d 字段是 Y 类的,后续还需要适配更多类)
<?xml version="1.0" encoding="GB2312"?>
<DocumentElement>
<Result>0</Result>
<Error></Error>
<DataTable>
<a>/<a>
<b>/<b>
</DataTable>
<DataTable>
<a>/<a>
<b>/<b>
</DataTable>
</DocumentElement>
<!--------------------------或者-------------------------->
<?xml version="1.0" encoding="GB2312"?>
<DocumentElement>
<Result>0</Result>
<Error></Error>
<DataTable>
<c>/<c>
<d>/<d>
</DataTable>
<DataTable>
<c>/<c>
<d>/<d>
</DataTable>
</DocumentElement>
@XmlRootElement(name = "DocumentElement")
@XmlSeeAlso({X.class, Y.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseEntity <T> {
@XmlElement(name = "Result")
private String result;
@XmlElement(name = "Error")
private String error;
@XmlAnyElement(lax = true)
private List<T> dataTable;
public ResponseEntity() {
}
// getter/setter 省略
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class X {
private String a;
private String b;
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Y {
private String c;
private String d;
}
//获得 JAXBContext 类的新实例。参数为类的地址
JAXBContext context = JAXBContext.newInstance(t.getClass());
//创建一个可以用来将 XML 数据转换为 java 内容树的 Unmarshaller 对象。
Unmarshaller um = context.createUnmarshaller();
//创建一个 StringReader 将 xml 报文转成流
StringReader sr = new StringReader(xml);
//调用 unmarshal 进行转换,并把 Object 类型强转为调用者的类型
t = (T) um.unmarshal(sr);
//将对象返回给调用者
return t;
目前的问题
- 如果 X 、Y 类 @XmlRootElement 不加 name = "DataTable",转换后的 Bean 的 list 为空
- 如果 X 、Y 类 @XmlRootElement 其中一个类加 name = "DataTable",转换后的 Bean 的 list 类型内容一直都是那个类
- 如果 X 、Y 类 @XmlRootElement 都加 name = "DataTable",转换后的 Bean 的 list 类型会不匹配(猜测 java 泛型在编译时类型被擦去, 反射不能确定具体那个类,参考[当 Jaxb 遇到泛型]: https://www.cnblogs.com/mumuxinfei/p/8948299.html)
不知道各位有没有遇到过或提供一下解决思路。不胜感激