Jaxb處理obj(泛型)xml

  最近調試要求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.******。或其任何超類是 已知此上下文。]

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章