我們在請求國家系統經常會遇到webservice 接口他們一般傳輸使用xml 所以使用xml就會遇到和實體接互相轉換以及實體與xml
不對應怎麼處理。接下來提供一種解決方案 他可以處理xml 和實體隨意轉換!
- 建立實體(模擬發票實體)
package com.dairuijie.test.bean;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
/**
*
* @ClassName: InvoiceBean
* @Description:TODO(這裏用一句話描述這個類的作用)
* @author: drj
* @date: 2019年8月11日 下午5:36:39
*
* @Copyright: 2019
*
*/
@XStreamAlias("invoice")
public class InvoiceBean {
/**
* 發票id
*/
@XStreamAlias("invoiceId")
private Long invoiceId;
/**
* 發票號碼
*/
@XStreamAlias("invoiceNum")
private String invoiceNum;
/**
* 發票代碼
*/
@XStreamAlias("invoiceCode")
private String invoiceCode;
/**
* 商品名稱
*/
@XStreamImplicit(itemFieldName="invoiceDetail")
private List<InvoiceDetail> invoiceDetail;
public Long getInvoiceId() {
return invoiceId;
}
public void setInvoiceId(Long invoiceId) {
this.invoiceId = invoiceId;
}
public String getInvoiceNum() {
return invoiceNum;
}
public void setInvoiceNum(String invoiceNum) {
this.invoiceNum = invoiceNum;
}
public String getInvoiceCode() {
return invoiceCode;
}
public void setInvoiceCode(String invoiceCode) {
this.invoiceCode = invoiceCode;
}
public List<InvoiceDetail> getInvoiceDetail() {
return invoiceDetail;
}
public void setInvoiceDetail(List<InvoiceDetail> invoiceDetail) {
this.invoiceDetail = invoiceDetail;
}
@Override
public String toString() {
return "InvoiceBean [invoiceId=" + invoiceId + ", invoiceNum=" + invoiceNum + ", invoiceCode=" + invoiceCode
+ ", invoiceDetail=" + invoiceDetail + "]";
}
}
package com.dairuijie.test.bean;
import java.math.BigDecimal;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
*
* @ClassName: InvoiceDetail
* @Description:TODO(這裏用一句話描述這個類的作用)
* @author: drj
* @date: 2019年8月11日 下午8:14:50
*
* @Copyright: 2019
*
*/
@XStreamAlias("invoiceDetail")
public class InvoiceDetail {
/**
* 貨物名稱
*/
@XStreamAlias("goodsName")
private String goodsName;
/**
* 單位
*/
@XStreamAlias("unit")
private String unit;
/**
* 單價
*/
@XStreamAlias("price")
private BigDecimal price;
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "InvoiceDetail [goodsName=" + goodsName + ", unit=" + unit + ", price=" + price + "]";
}
}
- XStreamConvertor xml工具類
package com.dairuijie.test.utils;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.oxm.xstream.XStreamMarshaller;
import com.dairuijie.test.bean.InvoiceBean;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.zl.vtax.base.BusinessException;
/**
*
* @ClassName: XStreamConvertor
* @Description:TODO(xml 工具類)
* @author: drj
* @date: 2019年8月11日 下午10:35:52
*
* @param <T>
* @Copyright: 2019
*
*/
public class XStreamConvertor<T> {
private static XStreamConvertor<?> instance = null;//單例模式
private static Map<String, XStreamMarshaller> xstreamCache = new ConcurrentHashMap<String, XStreamMarshaller>();
private static final String XML_TAG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
private static final String GBK = "UTF-8";
static {
instance = new XStreamConvertor<>();
}
public String toXml(T pojo) throws BusinessException {
String clzName = pojo.getClass().getName();
XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
if (xstreamMarshaller == null) {
xstreamMarshaller = new XStreamMarshaller();
xstreamMarshaller.setEncoding(GBK);
xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
xstreamCache.put(clzName, xstreamMarshaller);
}
XStream xStream = xstreamMarshaller.getXStream();
XStream.setupDefaultSecurity(xStream);//防止出現 xStream:Security framework of XStream not initialized, XStream is probably vulnerable.
xStream.allowTypes(new Class[]{InvoiceBean.class});//允許轉換對象
xStream.processAnnotations(pojo.getClass());
return XML_TAG + xStream.toXML(pojo).replaceAll("<tiripPackage>", "").replaceAll(""", "\"");
}
@SuppressWarnings("unchecked")
public T fromXml(Class<T> clz, String xml) {
String clzName = clz.getName();
XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
if (xstreamMarshaller == null) {
xstreamMarshaller = new XStreamMarshaller();
xstreamMarshaller.setEncoding(GBK);
xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
xstreamCache.put(clzName, xstreamMarshaller);
}
XStream xStream = xstreamMarshaller.getXStream();
xStream.setClassLoader(clz.getClassLoader());
xStream.processAnnotations(clz);
return (T) xStream.fromXML(xml);
}
@SuppressWarnings("unchecked")
public static XStreamConvertor<Object> getInstance() {
return (XStreamConvertor<Object>) instance;
}
}
- 測試類
package com.dairuijie.test.utils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.dairuijie.test.bean.InvoiceBean;
import com.dairuijie.test.bean.InvoiceDetail;
/**
*
* @ClassName: XmlBeanUtils
* @Description:TODO(這裏用一句話描述這個類的作用)
* @author: drj
* @date: 2019年8月11日 下午9:01:31
*
* @Copyright: 2019
*
*/
public class XmlBeanUtils {
public static void main(String[] args) {
List<InvoiceDetail> list = new ArrayList<InvoiceDetail>();
InvoiceDetail detail = new InvoiceDetail();
detail.setGoodsName("牛肉");
detail.setPrice(new BigDecimal("99"));
detail.setUnit("元");
list.add(detail);
InvoiceBean bean = new InvoiceBean();
bean.setInvoiceCode("99999");
bean.setInvoiceId(999L);
bean.setInvoiceNum("99999");
bean.setInvoiceDetail(list);
@SuppressWarnings("rawtypes")
XStreamConvertor xmlUtils = XStreamConvertor.getInstance();
@SuppressWarnings("unchecked")
String xmlstr = xmlUtils.toXml(bean);
System.out.println("實體轉xml:" + xmlstr);
@SuppressWarnings("unchecked")
InvoiceBean invoiceBean = (InvoiceBean) xmlUtils.fromXml(InvoiceBean.class, xmlstr);
System.out.println("xml轉實體: " + invoiceBean);
}
}
- 結果
實體轉xml:<?xml version="1.0" encoding="UTF-8"?><invoice>
<invoiceId>999</invoiceId>
<invoiceNum>99999</invoiceNum>
<invoiceCode>99999</invoiceCode>
<invoiceDetail>
<goodsName>牛肉</goodsName>
<unit>元</unit>
<price>99</price>
</invoiceDetail>
</invoice>
xml轉實體: InvoiceBean [invoiceId=999, invoiceNum=99999, invoiceCode=99999, invoiceDetail=[InvoiceDetail [goodsName=牛肉, unit=元, price=99]]]