最近调试要求xml报文交互项目,之前就应用过Jaxb来处理object互转xml,只是此次项目中接口报文较多,且相似,所以将过去的代码要重新封装重构下。
如下报文,外层不变,只有body内容不固定,所以用到泛型加以控制:
<?xml version="1.0" encoding="UTF-8"?> <Document> <Request> <Head> <Version>Version</Version> <orgId>orgId</CertId> </Head> <Body> <infoList> <info> <name>name</name> <dept>dept</dept> </info> <info> <name>111111111</name> </info> </infoList> </Body> </Request> </Document>
实体Document
package com.test; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "",propOrder = { "request" }) @XmlRootElement(name = "Document") public class Document { @XmlElements({ @XmlElement(name = "Request",type = com.test.intfc.Request.class) }) protected BaseRequest<? extends BaseBody> request; setter()/getter() }
实体BaseRequest
package com.test; @XmlTransient public abstract class BaseRequest<T extends BaseBody> { protected Head head; protected T body; public abstract Head getHead(); public abstract void setHead(Head value); public abstract T getBody(); public abstract void setBody(T value); }
实体Head......略
实体Basebody
package com.test; @XmlTransient public abstract class BaseBody {}
实体Request
package com.test.intfc; @XmlRootElement(name = "Request") @XmlAccessorType(XmlAccessType.PROPERTY) @XmlType(name = "",propOrder = { "head","body" }) public class Request extends BaseRequest<Body> { @XmlElement(name = "Head",required = true) @Override public Head getHead() { return head; } @Override public void setHead(Head value) { this.head = value; } @XmlElement(name = "Body",required = true) @Override public Body getBody() { return body; } @Override public void setBody(Body value) { this.body = value; } }
实体Body
package com.test.intfc; @XmlRootElement(name = "Body") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "",propOrder = { "name","dept" }) public class Body extends BaseBody { // 简写.... @XmlElement(name = "name",required = true) protected String name; @XmlElement(name = "dept",required = true) protected String dept; ...setter()/getter() }
测试
package com.test; public class Test { public static void main(String[] args) { ...... Request req = new Request(); Document doc = new Document(); doc.setRequest(req); JaxbBinder reqBinder = new JaxbBinder(Document.class); String xmlReq = reqBinder.toXml(doc,true); } }
JaxbBinder从网上搜,一堆堆的例子。。。。
xml --> xsd --> Object 方式快速生成的
命令如:$ xjc -d . -p com.test ./example.xsd
生成的Object实体需要自己按上面的修改,注意“@注解”的应用,否则将报异常:[javax.xml.bind.JAXBException:类 org.test.******。或其任何超类是 已知此上下文。]
原文链接:https://www.f2er.com/xml/295706.html