最近在对接1个Soap接口,Java来操作是及其麻烦,想一键生成请求实体和响应实体,但是很多工具都太陈旧,无奈手工生成XML发送Http请求来实现,学习下Java序列化对象的知识,然后开始开发这个功能。
(1).定义对象:
@XmlRootElement(name = "user") public class User { private String name; private int age; private String birthday; }
注解部分声明了Xml的root节点名称
(2). 初始化对象:
// 01.构建实体 User user = new User(); user.setName("李燕茹"); user.setAge(18); user.setBirthday("19950810");
(3).转换对象为XML
// 02.转换为Xml try { // 创建JAX上下文 JAXBContext context = JAXBContext.newInstance(User.class); // 创建XML序列化对象 Marshaller marshaller = context.createMarshaller(); // 设置输出的XML格式化增强阅读体验 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 序列化XML并保存到输出流中 StringWriter writer = new StringWriter(); marshaller.marshal(user, writer); System.out.println(writer); } catch (Exception exception) { System.out.println("转换Xml异常:" + exception.getMessage()); }
(4).生成xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <user> <age>18</age> <birthday>19950810</birthday> <name>李燕茹</name> </user
但是实际上webservice的xml并没有这么简单,例如追加属性值,假如我们需要在name节点增加属性值,比如这样:
<name xsi:nil="true">李燕茹</name>
看起来好简单,但是真的很麻烦。
首先我们需要将name单独抽为1个实体对象,如下:
@XmlAccessorType(XmlAccessType.FIELD) public class Name { @XmlAttribute(name = "xsi:nil") private String xsiNil; @XmlValue private String value; }
name节点值的变量名称不需要特殊定义,标记为@XmlValue即可。