1.前言
以前在学校学习的时候,没有接触过WebService。如今开始实习之后,由于项目需要,要对接别人程序提供出来的接口,要用到WebService。而在使用WebService的时候,我这里入参和出参都需要是xml。而为了封装信息和以后维护方便等理由,这里很自然而然的,就需要用到jaxb技术,将一个对象转换为xml以及将xml转换为一个对象。(其实说白了,就像是使用gson解析json数据一样,只不过gson使用起来比较方便)。这里只介绍一下,在实际应用中如何实现对象与xml之间的相互转换,并不述说WebService。
2.入参
首先,当我调用WebService发起请求时,入参要求我传入的是xml格式的,现在,先让我们看一个入参的例子:
<Request>
<PatientId>3869622</PatientId>
<VisitId>12097107</VisitId>
</Request>
xml的格式很简单,相信稍微学过一下xml的,一看就懂了。说老实话,如果要我们自己用字符串拼接这么一串xml格式的入参,其实也是不难的。
String inXml = "<Request><PatientId>" + PatientId + "</PatientId><VisitId>" + VisitId + "</VisitId></Request>";
但是,不难发现,这样的话,当这个入参内容很多的时候,这个字符串就会变得很长,而且还需要有很多变量去组拼字符串,可维护性是非常低的。因为,我们需要有一个类去封装数据,然后再真正使用的时候,将这个类的对象,通过jaxb转换为xml。
下面让我们看看这个类的样子:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Request")
public class GetBillRateRequest {
private String patientId;
private String visitId;
@XmlElement(name = "PatientId")
public String getPatientId() {
return patientId;
}
public void setPatientId(String patientId) {
this.patientId = patientId;
}
@XmlElement(name = "VisitId")
public String getVisitId() {
return visitId;
}
public void setVisitId(String visitId) {
this.visitId = visitId;
}
}
这个类中只有两个成员变量,刚好对应上面的字符串。
@XmlRootElement(name = "Request")定义最外层的节点,也就是根节点的名称。
<Request>
……
</Request>
如果对名字没有要求的话,直接@XmlRootElement()这样写就可以了。
<getBillRateRequest>
……
</getBillRateRequest>
但是,因为项目的要求,我这边每一个WebService的请求,都必须是用<Request>做最外层的节点,包括里面的内容的,这么多种用于封装信息的类,不可能每一个类的类名都叫Request吧?而且你仔细观察的话,GetBillRateRequest这样的类名,转换后会变成<getBillRateRequest>,也就是说哪怕类名是Request也是不符合要求的。所以,这里我采用了@XmlRootElement(name = "Request")。
这里复制一下官方文档的内容,罗列一下这个注解的其他属性
Modifier and Type |
---|