JAXB注解的使用详解(用户xml和bean之间的操作)
一、 JAXB是什么?
JAXB(即Java Architecturefor XML Binding)是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。
二;相关注解的解释
1) @XmlType
该注解用在class类上,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

2) @XmlElement
该注解用在类的属性上,用于将属性映射为xml的子节点。可通过在后面配置name属性值来改变java属性在xml文件中的名称。如:

效果如下:

注意:@XmlElement转化的属性的格式是<STATUS>1</STATUS>这种形式,中间的1代表属性STATUS的值。
3) @XmlRootElement
类级别的注解,对应的是xml文件中的根节点。常与 @XmlType 和 @XmlAccessorType一起使用。如

@XmlRootElement最核心的作用是用来配置根节点名称
效果如下

4) @XmlAttribute
用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:

效果如下:

通过@XmlAttribute将对应的属性放在同root目前一起。作为root区域的属性存在
5) @XmlAccessorType
@XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分别为:
XmlAccessType.FIELD:java对象中的所有成员变量;
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量;
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量;
XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素。
注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER。因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

6) @XmlAccessorOrder
用于对java对象生成的xml元素进行排序。它有两个属性值:
AccessorOrder.ALPHABETICAL:对生成的xml元素按字母顺序排序;
XmlAccessOrder.UNDEFINED:不排序。

效果如下:

7) @XmlTransient
用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。


8) @XmlJavaTypeAdapter
@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。
@XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类
三;xml和bean之间的转化
1:通过
javax工具类
package kai.wu.dhwerservice.biz.xml;
import javax.xml.bind.*;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Optional;
/**
* * * GOOK LUCK * *
*
* @Author: wkn,
* @Date: 2020/11/5.
* @DESC:
*/
public class JaxbXmlUtil {
/**
* java对象转换为xml文件
* @param load java对象.Class
* @return xml文件的String
* @throws JAXBException
*/
public static String beanToXml(Object obj, Class<?> load,String encoding) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
Optional.ofNullable(encoding).map((x) -> {
try {
marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
} catch (PropertyException e) {
e.printStackTrace();
}
return "";
});
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
}
/**
* xml文件配置转换为对象
* @param xmlPath xml文件路径
* @param load java对象.Class
* @return java对象
* @throws JAXBException
* @throws IOException
*/
@SuppressWarnings("unchecked")
public static <T> T xmlToBean(String xmlPath, Class<T> load) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(load);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(xmlPath));
}
/**
* JavaBean转换成xml
* 默认编码UTF-8
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
// return convertToXml(obj, "UTF-8");
return convertToXml(obj, "UTF-8");
}
/**
* JavaBean转换成xml
* @param obj
* @param encoding
* @return
*/
public static String convertToXml(Object obj, String encoding) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* JavaBean转换成xml去除xml声明部分
* @param obj
* @param encoding
* @return
*/
public static String convertToXmlIgnoreXmlHead(Object obj, String encoding) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* xml转换成JavaBean
* @param xml
* @param c
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T converyToJavaBean(String xml, Class<T> c) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
2:测试
ImlDemoInterface imlDemoInterface = new ImlDemoImpl();
XmlTransferResponse response = new XmlTransferResponse();
response.setId(1);
XmlTransferRequest request = new XmlTransferRequest();
request.setName("na");
request.setStatus("1");
request.setAddress("fd");
//格式转化,将bean转化为xml
String xml = JaxbXmlUtil.beanToXml(request,R,"utf-8");
System.out.println(xml);
//将xml转化为bean
XmlTransferRequest response1 = JaxbXmlUtil.xmlToBean(xml,XmlTransferRequest.class);
System.out.println(response1.toString());
System.out.println(xml);
System.out.println(""+R);
System.out.println(""+T);
System.out.println(""+request+response+"");
测试结果

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)