在解决平台里一个万能动态webserivce客户端时,中间涉及到将一个java对象转成XML的过程,其中网上很多资料说使用JAXB将java转成XML必须要在java对象上加@XmlRootElement注解,这个让开发者添加个注解的确不费劲,但是总是不甘心,凭什么没有这个注解就不行?这个问题要解决的关键突破点就是搞明白@XmlRootElement注解的作用到底是什么就行了,但是我这边时间紧迫,而且网上很多资料对这个说的也是是是而非,因此打算放到以后再去研究。可是当前问题如何解决呢?最后查了老外的一些文档,找了个新办法,这里先记下来。
1、java对象如下,注意没有加那个@XmlRootElement注解
package serivce;
public class Person {
private String id;
private String name;
private String sex;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2、测试代码如下:
Person user = new Person();
user.setId("123");
user.setName("zc");
user.setSex("女");
// 创建JAXB上下文
JAXBContext context = JAXBContext.newInstance(user.getClass());
// 创建QName,这个是关键,有了这个就不要使用@XmlRootElement注解了,关于QName的资料大家自己网上找,这里不赘述
QName q = new QName("http://ws.test.com","Person");
JAXBElement<Person> jaxbPerson = new JAXBElement<Person>(q,Person.class,user);
Marshaller m = context.createMarshaller();
StringWriter sw = new StringWriter();
m.marshal(jaxbPerson,sw);
// 输出转换后的XML代码
System.out.println(sw.toString());
3、转换结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Person xmlns:ns2="http://ws.test.com">
<id>123</id>
<name>zc</name>
<sex>女</sex>
</ns2:Person>
这个本身技术含量不大,但是由于国人对webservice等的使用只停留在基本API的层次上,而对底层的实现原理和细节关注甚少,所以网上关于webserivce稍微深入点的资料少之又少,更多的是Demo级别的资料,我之前找了很久也没有找到,要深入了解webserivce,其中的JAXB和SOAP协议是避不开的,我们使用的webservice的API也是封装了这些细节而已。这里写下来给网友分享下,希望能解决下大家的问题。
附JAXB学习网站,虽然是英文的,但是觉得很好用:点击打开链接
原文链接:https://www.f2er.com/xml/296028.html