Jaxb处理obj(泛型)<--->xml

前端之家收集整理的这篇文章主要介绍了Jaxb处理obj(泛型)<--->xml前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

  最近调试要求xml报文交互项目,之前就应用过Jaxb来处理object互转xml,只是此次项目中接口报文较多,且相似,所以将过去的代码要重新封装重构下。

如下报文,外层不变,只有body内容不固定,所以用到泛型加以控制:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Document>
  3. <Request>
  4. <Head>
  5. <Version>Version</Version>
  6. <orgId>orgId</CertId>
  7. </Head>
  8. <Body>
  9. <infoList>
  10. <info>
  11. <name>name</name>
  12. <dept>dept</dept>
  13. </info>
  14. <info>
  15. <name>111111111</name>
  16. </info>
  17. </infoList>
  18. </Body>
  19. </Request>
  20. </Document>

实体Document

  1. package com.test;
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. @XmlType(name = "",propOrder = {
  4. "request"
  5. })
  6. @XmlRootElement(name = "Document")
  7. public class Document {
  8. @XmlElements({
  9. @XmlElement(name = "Request",type = com.test.intfc.Request.class)
  10. })
  11. protected BaseRequest<? extends BaseBody> request;
  12.  
  13. setter()/getter()
  14. }


实体BaseRequest

  1. package com.test;
  2.  
  3. @XmlTransient
  4. public abstract class BaseRequest<T extends BaseBody> {
  5.  
  6. protected Head head;
  7. protected T body;
  8. public abstract Head getHead();
  9. public abstract void setHead(Head value);
  10. public abstract T getBody();
  11. public abstract void setBody(T value);
  12. }

实体Head......略

实体Basebody

  1. package com.test;
  2.  
  3. @XmlTransient
  4. public abstract class BaseBody {}


实体Request

  1. package com.test.intfc;
  2.  
  3. @XmlRootElement(name = "Request")
  4. @XmlAccessorType(XmlAccessType.PROPERTY)
  5. @XmlType(name = "",propOrder = { "head","body" })
  6. public class Request extends BaseRequest<Body> {
  7.  
  8. @XmlElement(name = "Head",required = true)
  9. @Override
  10. public Head getHead() {
  11. return head;
  12. }
  13.  
  14. @Override
  15. public void setHead(Head value) {
  16. this.head = value;
  17. }
  18.  
  19. @XmlElement(name = "Body",required = true)
  20. @Override
  21. public Body getBody() {
  22. return body;
  23. }
  24.  
  25. @Override
  26. public void setBody(Body value) {
  27. this.body = value;
  28. }
  29. }

实体Body

  1. package com.test.intfc;
  2.  
  3. @XmlRootElement(name = "Body")
  4. @XmlAccessorType(XmlAccessType.FIELD)
  5. @XmlType(name = "",propOrder = {
  6. "name","dept"
  7. })
  8. public class Body extends BaseBody {
  9. // 简写....
  10. @XmlElement(name = "name",required = true)
  11. protected String name;
  12. @XmlElement(name = "dept",required = true)
  13. protected String dept;
  14. ...setter()/getter()
  15. }


测试

  1. package com.test;
  2.  
  3. public class Test {
  4. public static void main(String[] args) {
  5. ......
  6.  
  7. Request req = new Request();
  8. Document doc = new Document();
  9. doc.setRequest(req);
  10. JaxbBinder reqBinder = new JaxbBinder(Document.class);
  11.  
  12. String xmlReq = reqBinder.toXml(doc,true);
  13.  
  14. }
  15. }


JaxbBinder从网上搜,一堆堆的例子。。。。

xml --> xsd --> Object 方式快速生成

命令如:$ xjc -d . -p com.test ./example.xsd

生成的Object实体需要自己按上面的修改,注意“@注解”的应用,否则将报异常:[javax.xml.bind.JAXBException:类 org.test.******。或其任何超类是 已知此上下文。]

猜你在找的XML相关文章