From c4db15db9b64ad5d248dc45460661d67fe81832e Mon Sep 17 00:00:00 2001 From: "wei.peng" <123456> Date: Wed, 24 Jul 2019 20:30:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20XStream=20=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/i3plus-pojo-base/pom.xml | 4 + .../i3plus/pojo/base/annotation/XStreamCDATA.java | 18 ++ .../i3plus/pojo/base/common/XStreamFactory.java | 236 +++++++++++++++++++++ pom.xml | 5 + 4 files changed, 263 insertions(+) create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java diff --git a/modules/i3plus-pojo-base/pom.xml b/modules/i3plus-pojo-base/pom.xml index 888e1bd..e97c0bb 100644 --- a/modules/i3plus-pojo-base/pom.xml +++ b/modules/i3plus-pojo-base/pom.xml @@ -35,6 +35,10 @@ com.alibaba fastjson + + com.thoughtworks.xstream + xstream + diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java new file mode 100644 index 0000000..9ade29e --- /dev/null +++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java @@ -0,0 +1,18 @@ +package cn.estsh.i3plus.pojo.base.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description : XStream 数据转换的CDATA + * @Reference : + * @Author : wei.peng + * @CreateDate : 2019-07-23 下午5:52 + * @Modify: + **/ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface XStreamCDATA { +} diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java new file mode 100644 index 0000000..6787a28 --- /dev/null +++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java @@ -0,0 +1,236 @@ +package cn.estsh.i3plus.pojo.base.common; + +import cn.estsh.i3plus.pojo.base.annotation.XStreamCDATA; +import com.alibaba.fastjson.JSON; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.core.util.QuickWriter; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; +import com.thoughtworks.xstream.io.naming.NameCoder; +import com.thoughtworks.xstream.io.naming.NoNameCoder; +import com.thoughtworks.xstream.io.xml.DomDriver; +import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; +import com.thoughtworks.xstream.io.xml.XppDomDriver; +import lombok.Data; +import sun.plugin2.util.SystemUtil; + +import java.io.Serializable; +import java.io.Writer; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * @Description : Xml 工厂 + * @Reference : + * @Author : wei.peng + * @CreateDate : 19-7-23 下午5:58 + * @Modify: + **/ +public class XStreamFactory { + + private static final XStream xStream = XStreamFactory.getXStream(); + + public static final String CDATA_PREFIX = ""; + + public static XStream getXStream() { + final NameCoder nameCoder = new NoNameCoder(); + XStream xStream = new XStream(new XppDomDriver(nameCoder) { + @Override + public HierarchicalStreamWriter createWriter(Writer out) { + return new PrettyPrintWriter(out, nameCoder) { + boolean cdataFlag = false; + Class targetClass = null; + + @Override + public void startNode(String name, Class clazz) { + super.startNode(name, clazz); + if (targetClass == null) { + targetClass = clazz; + } + cdataFlag = isCDATA(targetClass, name); + } + + @Override + public void writeText(QuickWriter writer, String text) { + if (cdataFlag) { + writer.write(CDATA_PREFIX); + writer.write(text); + writer.write(CDATA_SUFFIX); + } else { + writer.write(text); + } + } + }; + } + }); + return xStream; + } + + + private static boolean isCDATA(Class clazz, String fieldAlias) { + //检查类本身 + boolean cdataFlag = isExistCDATA(clazz, fieldAlias); + if (cdataFlag) { + return cdataFlag; + } + //继续检查父类 + Class superClazz = clazz.getSuperclass(); + while (!superClazz.equals(Object.class)) { + cdataFlag = isExistCDATA(superClazz, fieldAlias); + if (cdataFlag) { + return cdataFlag; + } + superClazz = superClazz.getClass().getSuperclass(); + } + return false; + } + + /** + * 检查是否有 @XStreamCDATA 注解 + * + * @param clazz clazz + * @param fieldAlias fieldAlias + * @return + */ + private static boolean isExistCDATA(Class clazz, String fieldAlias) { + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (field.getAnnotation(XStreamCDATA.class) != null) { + XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class); + if (xStreamAlias != null && fieldAlias.equals(xStreamAlias.value())) { + return true; + } else { + if (fieldAlias.equals(field.getName())) { + return true; + } + } + } + } + return false; + } + + + + /** + * Javabean 转XML + * @param + * @return xml字符串 + */ + public static String toXml(T t) { + xStream.processAnnotations(t.getClass()); + String headLine = "\n"; + return headLine + xStream.toXML(t); + } + + /** + * XML字符串转javabean + * + * @param xmlStr xml字符串 + * @param + * @return Java对象 + */ + public static T toJavaBean(String xmlStr) { + return (T) xStream.fromXML(xmlStr); + } +// +// public static void main(String[] args) { +// User u = new User(0, "zhangsan0", "zhangsanpwd0"); +// User u1 = new User(1, "zhangsan1", "zhangsanpwd"); +// User u2 = new User(2, "zhangsan2", "zhangsanpwd"); +// User u3 = new User(3, "zhangsan3", "zhangsanpwd"); +// +// Role r1 = new Role(1, "Admin", "Admin1"); +// Role r2 = new Role(2, "Admin", "Admin2"); +// Role r3 = new Role(3, "Admin", "Admin3"); +// +// DataAdapter ad = new DataAdapter(10086L,UUID.randomUUID().toString(),"sssfwef",u1); +// u1.setRole(r1); +// +// u2.getRoleList().add(r1); +// u2.getRoleList().add(r2); +// u2.getRoleList().add(r3); +// +// u3.setRole(r1); +// u3.getRoleList().add(r2); +// u3.getRoleList().add(r3); +// +// System.out.println(toXml(u) + "\n\n "); +// System.out.println(toXml(u1) + "\n\n "); +// System.out.println(toXml(u2) + "\n\n "); +// System.out.println(toXml(u3) + "\n\n "); +// System.out.println(toXml(ad) + "\n\n "); +// +// System.out.println(JSON.toJSONString(toJavaBean(toXml(ad)))); +// +// } +} +// +//@Data +//@XStreamAlias("DataAdapter") +////对应carInfos元素 +//class DataAdapter implements Serializable { +// +// @XStreamAsAttribute +// private Long scId; +// private String key; +// @XStreamCDATA +// private String resultData; +// +// private Object auth; +// +// public DataAdapter(Long scId, String key, String resultData, Object auth) { +// this.scId = scId; +// this.key = key; +// this.resultData = resultData; +// this.auth = auth; +// } +//} +// +//@Data +//@XStreamAlias("user") +////对应carInfos元素 +//class User implements Serializable { +// private static final long serialVersionUID = -7554548655397869156L; +// +// @XStreamAsAttribute +// private Integer id; +// private String loginName; +// private String loginPwd; +// +// private Role role; +// private List roleList = new ArrayList(); +// private List roleArray; +// +// public User() { +// } +// +// public User(Integer id, String loginName, String loginPwd) { +// this.id = id; +// this.loginName = loginName; +// this.loginPwd = loginPwd; +// } +//} +// +//@Data +//@XStreamAlias("role") +////对应carInfos元素 +//class Role implements Serializable { +// private static final long serialVersionUID = -3134157833696958743L; +// @XStreamAsAttribute +// private Integer id; +// private String roleName; +// private String roleCode; +// +// public Role() { +// } +// +// public Role(Integer id, String roleName, String roleCode) { +// this.id = id; +// this.roleName = roleName; +// this.roleCode = roleCode; +// } +//} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8975679..6c327d0 100644 --- a/pom.xml +++ b/pom.xml @@ -150,6 +150,11 @@ fastjson 1.2.49 + + com.thoughtworks.xstream + xstream + 1.4.11.1 +