Spring OXM-XStream注解

简介: Spring OXM-XStream注解

概述


XStream不但可以通过编程的方式对XML进行转换,而且支持基于注解的方式。

我们先来看下支持的注解


image.png


示例


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;
    @XStreamImplicit
    private 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;
    @XStreamAsAttribute
    private 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

相关文章
|
4天前
|
前端开发 Java 开发者
SpringBoot(五)之新增注解
用于 Spring MVC 测试,仅加载 Web 层。
28 10
|
4天前
|
Java API 数据格式
Spring三兄弟:Spring、Spring Boot、Spring Cloud的100个常用注解大盘点
Spring三兄弟:Spring、Spring Boot、Spring Cloud的100个常用注解大盘点
|
6天前
|
Java 数据库连接 数据库
Springboot整合mybatis注解版(202005)
Springboot整合mybatis注解版(202005)
14 3
|
6天前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
16 2
|
1天前
|
前端开发 Java Spring
蓝易云 - 详解SpringBoot的常用注解
以上就是SpringBoot中常用的一些注解,正确理解和使用这些注解,可以帮助我们更好地使用SpringBoot框架进行开发。
7 0
|
2天前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
5 0
|
2天前
|
XML Java 数据库
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
6 0
|
2天前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
5 0
|
2天前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
6 0
|
2天前
|
前端开发 Java Spring
蓝易云 - 详解SpringBoot的常用注解
以上就是SpringBoot中常用的一些注解,正确理解和使用这些注解,可以帮助我们更好地使用SpringBoot框架进行开发。
3 0