jaxb解析xml在WebService中的使用,以及Date类型的解决方案

本文介绍了在Java中使用JAXB进行XML与对象互相转换的方法,特别是在WebService场景下。详细讲解了如何处理入参XML,包括设置@XmlRootElement和@XmlElement注解以满足特定格式要求。同时,文章探讨了出参中包含集合的处理方式,使用@XmlElementWrapper和@XmlElement注解封装数据。最后,针对XML中不同日期格式,提出了使用XmlAdapter进行Date类型转换的解决方案。
摘要由CSDN通过智能技术生成

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值