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

前端之家收集整理的这篇文章主要介绍了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.******。或其任何超类是 已知此上下文。]

原文链接:https://www.f2er.com/xml/295706.html

猜你在找的XML相关文章