javascript
Spring OXM-XStream注解
- 概述
- 示例
- 示例源碼
概述
XStream不但可以通過編程的方式對XML進行轉換,而且支持基于注解的方式。
我們先來看下支持的注解
| @XStreamAlias | 別名注解 | 類、字段 |
| @XStreamAsAttribute | 轉換成屬性 | 字段 |
| @XStreamOmitField | 忽略字段 | 字段 |
| @XstreamConverter | 注入轉換器 | 對象 |
| @XstreamImplicit | 隱式集合 | 集合字段 |
示例
package com.xgj.oxm.xstream.quickDemo.annotation;import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map;import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.annotations.XStreamImplicit;/*** * * @ClassName: User* * @Description: 使用注解* * @author: Mr.Yang* * @date: 2017年12月6日 下午9:17:11*/@XStreamAlias("user") public class User {@XStreamAsAttribute@XStreamAlias("userId")private int id;@XStreamAlias("userName")private String userName;@XStreamAlias("password")private String password;@XStreamAlias("credits")private int credits;@XStreamAlias("lastIp")private String lastIp;@XStreamConverter(DateConverter.class)private Date lastVisit;@XStreamImplicitprivate List<LoginLog> logs;private Map datas;public List<LoginLog> getLogs() {return logs;}public void setLogs(List logs) {this.logs = logs;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getCredits() {return credits;}public void setCredits(int credits) {this.credits = credits;}public String getLastIp() {return lastIp;}public void setLastIp(String lastIp) {this.lastIp = lastIp;}public Date getLastVisit() {return lastVisit;}public void setLastVisit(Date lastVisit) {this.lastVisit = lastVisit;}public void addLoginLog(LoginLog log) {if (this.logs == null) {logs = new ArrayList<LoginLog>();}logs.add(log);}public Map getDatas() {return datas;}public void setDatas(Map datas) {this.datas = datas;}} package com.xgj.oxm.xstream.quickDemo.annotation;import java.io.Serializable; import java.util.Date;import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamConverter;@XStreamAlias("loginLog") public class LoginLog implements Serializable {private static final long serialVersionUID = 1L;@XStreamAsAttribute@XStreamAlias("id")private int loginLogId;@XStreamAsAttributeprivate int userId;@XStreamAlias("ip")private String ip;@XStreamAlias("loginDate")@XStreamConverter(DateConverter.class)private Date loginDate;public int getLoginLogId() {return loginLogId;}public void setLoginLogId(int loginLogId) {this.loginLogId = loginLogId;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public Date getLoginDate() {return loginDate;}public void setLoginDate(Date loginDate) {this.loginDate = loginDate;}}解讀
通過 @XStreamAlias為別名注解,一般用于目標類或者字段,比如 @XStreamAlias(“user”) @XStreamAlias(“userId”)
@XstreamConverter注解用于注入自定義的轉換器,比如@XStreamConverter(DateConverter.class)注入一個日期轉換器
對于集合類型,可以用@XStreamImplicit注解來隱藏,作用和Stream#addImplicitCollection方法一樣。
@XStreamAsAttribute注解將Java對象映射為XML元素的一個屬性
@XStreamOmitField注解標注的Java對象將不會出現在XML中。
自定義轉換器
package com.xgj.oxm.xstream.quickDemo.annotation;import java.text.SimpleDateFormat; import java.util.Date;import com.thoughtworks.xstream.converters.SingleValueConverter;public class DateConverter implements SingleValueConverter {public DateConverter() { } public String toString(Object obj) {try {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(true);return dateFormat.format(((Date)obj));} catch (Exception e) {return null;}}public Object fromString(String date) {try {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(true);return dateFormat.parse(date);} catch (Exception e) {return null;}}public boolean canConvert(Class type) {return type.equals(Date.class);}}測試類
package com.xgj.oxm.xstream.quickDemo.annotation;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Date;import com.thoughtworks.xstream.XStream;public class Test {private static XStream xstream;static {xstream = new XStream();// (1) 第一張方式 手工注冊 : 實現該方法,判斷要轉換的類型// xstream.processAnnotations(User.class);// xstream.processAnnotations(LoginLog.class);// (2) 第二種方法 自動檢測 自動加載注解Bean 推薦xstream.autodetectAnnotations(true);}// 初始化轉換對象public static User getUser() {LoginLog log1 = new LoginLog();LoginLog log2 = new LoginLog();log1.setIp("192.168.1.91");log1.setLoginDate(new Date());log2.setIp("127.0.0.1");log2.setLoginDate(new Date());User user = new User();user.setId(1);user.setUserName("xstream");user.addLoginLog(log1);user.addLoginLog(log2);return user;}/*** JAVA對象轉化為XML*/public static void objectToXml() throws Exception {User user = getUser();FileOutputStream fs = new FileOutputStream("D://XStreamAnnotationSample.xml");OutputStreamWriter writer = new OutputStreamWriter(fs,Charset.forName("UTF-8"));xstream.toXML(user, writer);System.out.println("output xml:\n" + xstream.toXML(user));}/*** XML轉化為JAVA對象*/public static User xmlToObject() throws Exception {FileInputStream fis = new FileInputStream("D://XStreamAnnotationSample.xml");InputStreamReader reader = new InputStreamReader(fis,Charset.forName("UTF-8"));User user = (User) xstream.fromXML(fis);for (LoginLog log : user.getLogs()) {if (log != null) {System.out.println("訪問IP: " + log.getIp());System.out.println("訪問時間: " + log.getLoginDate());}}return user;}public static void main(String[] args) throws Exception {objectToXml();xmlToObject();} }解讀
要啟用XStream提供的注解功能,需要在執行對象和XML轉換之前注冊標注了XStream注解的Java對象。 比如
xstream.processAnnotations(User.class); xstream.processAnnotations(LoginLog.class);手工注冊User和LoginLog對象。
XStream除了手工注冊外,還提供了一個自動檢測標注了XStream注解的java對象的方法Xstream#autodetectAnnotations(true),不僅方便,而且提供了緩存機制緩存所有標注了XStream注解的Java對象。
運行結果
output xml: <user userId="1"><userName>xstream</userName><credits>0</credits><loginLog id="0" userId="0"><ip>192.168.1.91</ip><loginDate>2017-12-07 21:57:52</loginDate></loginLog><loginLog id="0" userId="0"><ip>127.0.0.1</ip><loginDate>2017-12-07 21:57:52</loginDate></loginLog> </user> Security framework of XStream not initialized, XStream is probably vulnerable. 訪問IP: 192.168.1.91 訪問時間: Thu Dec 07 21:57:52 CST 2017 訪問IP: 127.0.0.1 訪問時間: Thu Dec 07 21:57:52 CST 2017示例源碼
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
總結
以上是生活随笔為你收集整理的Spring OXM-XStream注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring OXM-XStream转换
- 下一篇: Spring OXM-XStream流化