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

相关文章
|
2月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
60 0
|
16天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
146 73
|
3月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
205 3
|
11天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
45 21
|
16天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
16天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
2月前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
84 4
SpringBoot必须掌握的常用注解!
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
49 4
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
159 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
67 2