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

相关文章
|
1月前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value(&quot;${xxx.xxx}&quot;)`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
110 4
|
20天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
9天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
30 4
SpringBoot必须掌握的常用注解!
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
66 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
11天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
47 2
|
11天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
27 1
|
2天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
9 0
|
25天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
5天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
8 0
|
30天前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解
下一篇
无影云桌面