10

JAXB 怎么实现带泛型 XML 转 Bean。

 3 years ago
source link: https://www.v2ex.com/t/796094
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Java

JAXB 怎么实现带泛型 XML 转 Bean。

  DavidDee · 1 天前 · 326 次点击
  • 转换的 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>
  • 目的 bean
@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)

不知道各位有没有遇到过或提供一下解决思路。不胜感激


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK