SpringBoot中集成JAXB实现XML与Java对象的互相转换
一、什么是JAXB
1.JDK中JAXB相关的重要Class和Interface
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
2.JDK中JAXB相关的重要Annotation
@XmlType,将Java类或枚举类型映射到XML模式类型 @XmlAccessorType(XmlAccessType.FIELD)
,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
在以上的注解中,用的最多的是@XMLType,@XmlAccessorType,@XmlRootElement。
二、Demo实战
maven依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
实体类
package com.erfou.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="xml")
@XmlType(propOrder ={
"is_subscribe",
"trade_type",
"bank_type",
"total_fee",
"fee_type",
"transaction_id",
"attach",
"time_end",
"trade_state",
"cash_fee",
"cash_fee_type",
"rate",
"mch_id",
"nonce_str",
"out_trade_no",
"return_code",
"return_msg",
"result_code",
"sign",
})
public class OrderqueryResult implements Serializable {
private String is_subscribe;
private String trade_type;
private String bank_type;
private String total_fee;
private String fee_type;
private String transaction_id;
private String attach;
private String time_end;
private String trade_state;
private String cash_fee;
private String cash_fee_type;
private String rate;
private String mch_id;
private String nonce_str;
private String out_trade_no;
private String return_code;
private String return_msg;
private String result_code;
private String sign;
@Override
public String toString() {
return "OrderqueryResult{" +
"is_subscribe='" + is_subscribe + '\'' +
", trade_type='" + trade_type + '\'' +
", bank_type='" + bank_type + '\'' +
", total_fee='" + total_fee + '\'' +
", fee_type='" + fee_type + '\'' +
", transaction_id='" + transaction_id + '\'' +
", attach='" + attach + '\'' +
", time_end='" + time_end + '\'' +
", trade_state='" + trade_state + '\'' +
", cash_fee='" + cash_fee + '\'' +
", cash_fee_type='" + cash_fee_type + '\'' +
", rate='" + rate + '\'' +
", mch_id='" + mch_id + '\'' +
", nonce_str='" + nonce_str + '\'' +
", out_trade_no='" + out_trade_no + '\'' +
", return_code='" + return_code + '\'' +
", return_msg='" + return_msg + '\'' +
", result_code='" + result_code + '\'' +
", sign='" + sign + '\'' +
'}';
}
}
此时给出最重要的进行Java对象和XML文件相互操作的核心代码XMLUtil.java,其中有着两种方式进行转换,一种是转换成对象和string类型的xml转换,一种是对象和xml文件进行转换。
XMLUtil.java
package com.koala.utils;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
/**
* 封装了XML转换成object,object转换成XML的代码
*
* @author riemann
* @date 2019/08/29 22:34
*/
public class XMLUtil {
/**
* 将对象直接转换成String类型的 XML输出
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
return sw.toString();
}
/**
** 将对象根据路径转换成xml文件
**
** @param obj
** @param path
*/
public static String convertToXml(Object obj, String path) {
FileWriter fw = null;
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
// 创建输出流
fw = new FileWriter(path);
marshaller.marshal(obj, fw);
} catch (JAXBException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fw.toString();
}
/**
* * 将String类型的xml转换成对象
* *
* * @param clazz
* * @param xmlStr
* * @return
*
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
/**
* * 将file类型的xml转换成对象
* *
* * @param clazz
* * @param xmlPath
* * @return
*
*/
public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
FileReader fr = null;
fr = new FileReader(xmlPath);
xmlObject = unmarshaller.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return xmlObject;
}
}
controller中调用:我这里是调用了接口,接口返回的是xml格式我需要把xml转成对象
package com.koala.controller;
import com.erfou.entity.OrderqueryResult;
import com.koala.utils.XMLUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class testController {
@Resource
private RestTemplate restTemplate;
private String url="https:/**************************/";
@GetMapping("/xml")
public String xml() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
StringBuffer xmlString = new StringBuffer();
String mch_id = "******************";
String nonce_str = "*********************************";
String out_trade_no = "***********************";
String sign = "******************************";
xmlString.append("<?xml version=\"1.0\"?>")
.append("<xml>")
.append("<mch_id>" + mch_id + "</mch_id>")
.append("<nonce_str>" + nonce_str + "</nonce_str>")
.append("<out_trade_no>" + out_trade_no + "</out_trade_no>")
.append("<sign>" + sign + "</sign>");
//请求体
HttpEntity<String> formEntity = new HttpEntity<>(xmlString.toString(), headers);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, formEntity, String.class);
log.info("返回值getBody"+stringResponseEntity.getBody());
Object o = XMLUtil.convertXmlStrToObject(new OrderqueryResult().getClass(), stringResponseEntity.getBody().toString());
return o.toString();
}
}
接口返回为:
转换结果为:
原文为:https://blog.csdn.net/u010349272/article/details/107250285/