jaxb 继承
现有要求,希望得到如下的数据
<root> <auth> <user></user> <token></token> <auth> <data> 主要的问题在这里,这里标签,要根据上下文而发生变化。 </data> </root>
于是我想到了,是否可以用过用继承来解决data标签的问题呢?不知道,以前没写过,那就试试吧。还好,最终终于是实现了。代码如下
先是root类的代码
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "root") @XmlAccessorType(XmlAccessType.FIELD) public class Root { @XmlElement(name = "auth") private Auth auth; // 重点看这里 @XmlElementRef private Data data; // getter and setter }
再是Auth类
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @XmlAccessorType(XmlAccessType.FIELD) public class Auth { @XmlElement(name = "user") private String user; @XmlElement(name = "token") private String token; // getter and setter }
好了,以上比较简单,重点来了,先看Data类,是怎么变化的吧
import javax.xml.bind.annotation.XmlSeeAlso; @XmlSeeAlso(value = { org.test.OrderData.class, org.test.UserData.class }) public class Data { }
看到了吧,父类里, XmlSeeAlso,写上它有哪些子类,差不多是这个意思吧。
再来一个OrderData
@XmlRootElement(name = "XML_DATA") @XmlAccessorType(XmlAccessType.FIELD) public class OrderData extends org.test.Data { }
你没有看错,OrderData里,写了个XmlRootElement标签。
好了,以上就是继承的实现了。主要是用到了@XmlSeeAlso,@XmlElementRef这两个标签。
XmlSeeAlso,主要是用来说明,父类有哪些个子类。
XmlElementRef,它的作用是:如果不你写的话,生成的XML,会存在xsi:样子的东东,也就是所谓的命名空间吧。自己尝试去吧。
参考文章:
这篇文章,使我确信,可以通过继承的方式来解决
http://blog.csdn.net/u014021905/article/details/42215137
这个里面提到了怎么实现继承,于是@XmlSeeAlso进入了我的视线。
http://blog.csdn.net/xiaofanku/article/details/49977097
这是怎么样去掉命名空间
http://blog.csdn.net/inaoen/article/details/49908875
这是为什么要在子类上写上@XmlRootElement标签。曾经我出现过个么个错误 @XmlElementRef 无效: 或其任意子类对此上下文是未知的。
http://www.apihome.cn/api/java/XmlElementRef.html
打个小广告
我建立了个群 622539266 JAVA知识交流,有在学JAVA的,或是想学JAVA的,可以加进来哦。
下一篇: 犯下这种错误,羞愧难当!