题前话:-------------相对于繁琐的dom4j SAX Final 代码更简洁 性能更高 适配性更强 工作量更少。我们只需要写好requestDTO 请求数据模型 一个构造函数 跟一个返回XML String 转换成返回responseDTO model 根据返回数据做相应业务操作就可以了。下面说 requestDTO 请求模型的注解详解。在做这个之前。。用dom4j 做的XML解析。。想到尽100个XML的解析,很崩溃。然后从DOM4J 果断切换到jaxb 其中 时间格式化 以及同名组件的处理 被坑过。本人小白第一次写博文。希望跟大神多多交流。然后请各位大神轻喷。
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.springframework.util.StringUtils;
import org.w3c.dom.Node;
/*
* @Description:JAXB用于XML的转换
*=====================================================================================================
*
*
*=====================================================================================================
* @author LiangChun
* @date 2017年11月24日
* @version V1.0
*/
public class JAXBUtil {
/**
* 获取JAXBContext实例。
*
* @param
* @return
*/
private static final JAXBContext getJAXBContext(Class<?> c) {
JAXBContext jaxbContext = null;
try {
jaxbContext = JAXBContext.newInstance(c);
} catch (JAXBException e) {
e.printStackTrace();
}
return jaxbContext;
}
/**
* 将报文节点反序列化为实体类
*
* @param xml
* @param classs
* @return
*/
public static final Object documentToModel(String xml, Class<?> c) {
if (StringUtils.isEmpty(xml)) {
return null;
}
Object object = null;
JAXBContext jaxbContext = getJAXBContext(c);
try {
// 得到反序列化实例Unmarshaller
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
object = unmarshaller.unmarshal(new StringReader(xml));
} catch (JAXBException e) {
e.printStackTrace();
}
return object;
}
public static final String modelToXMLGBK(Object obj, boolean flag) {
return modelToXML(obj, "GBK", flag);
}
public static final String modelToXMLUTF8(Object obj, boolean flag) {
return modelToXML(obj, "UTF-8", flag);
}
/**
* 将实体类转序列化为对应String类型xml节点
*
* @param obj 实体对象
* @param flag 是否去除报文头 true是/false否
* @return
*/
public static final String modelToXML(Object obj, String encoding ,boolean flag) {
StringWriter writer = new StringWriter();
JAXBContext jaxbContext = getJAXBContext(obj.getClass());
String result = null;
try {
Marshaller marshaller = jaxbContext.createMarshaller();
// 设置序列化的编码格式
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
// 设置格式化输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 去掉报文头
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, flag);
marshaller.marshal(obj, writer);
result = writer.toString();
// result=result.replaceAll(" ", "");
} catch (JAXBException e) {
e.printStackTrace();
}
System.out.println("未设置格式化输出:" + result);
return result;
}
/**
* 将实体类转序列化为对应node节点
*
* @param obj
* 实体类
* @param node
* 创建的新节点
* @return
*/
public static final Node modelToNode(Object obj, Node node) {
JAXBContext jaxbContext = getJAXBContext(obj.getClass());
try {
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(obj, node);
} catch (JAXBException e) {
e.printStackTrace();
}
return node;
}
}
-----------------------------------------------------分割线 上面是jaxbUtil 可以完成xml 的解析 xml转model model 转xml 注释很详细-----------------------------
@XmlRootElement(name = "User") // 根节点名称
@XmlElement(name= "NAME") //子节点名称
@XmlJavaTypeAdapter( DateAdapter.class ) //此处可以格式时间
@XmlElement(name= "SEX") // enum 转成xml 节点
@XmlAccessorType(XmlAccessType.FIELD) // 如果对接的系统用此注释 效率成倍增加。只需声明的变量名跟XML中的节点相对应即可
文章最后会附上 用到的类
先来最简单的
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 此处模拟用户请求参数 最简单的
*
*/
@XmlRootElement(name = "User") // 根节点名称
public class UserRequestDTO implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5755470921262396696L;
private String name;// 必传字段
private String sex;
private String age;
private String registerTime;
private String email;
private String mobile;// 必传字段
private String idNumber;// 必传字段
public String getName() {
return name;
}
@XmlElement(name = "NAME")
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
@XmlElement(name = "SEX")
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
@XmlElement(name = "AGE")
public void setAge(String age) {
this.age = age;
}
public String getRegisterTime() {
return registerTime;
}
@XmlElement(name = "REGISTERTIME")
public void setRegisterTime(String registerTime) {
this.registerTime = registerTime;
}
public String getEmail() {
return email;
}
@XmlElement(name = "EMAIL")
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
@XmlElement(name = "MOBILE")
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getIdNumber() {
return idNumber;
}
@XmlElement(name = "IDNUMBER")
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public UserRequestDTO() {
super();
}
// 必传字段构造函数
public UserRequestDTO(String name, String mobile, String idNumber) {
super();
this.name = name;
this.mobile = mobile;
this.idNumber = idNumber;
}
// 全参构造函数
public UserRequestDTO(String name, String sex, String age, String registerTime, String email, String mobile,
String idNumber) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.registerTime = registerTime;
this.email = email;
this.mobile = mobile;
this.idNumber = idNumber;
}
}
对应测试类
package com.csdn.test;
import com.csdn.request.UserRequestDTO;
import com.csdn.util.JAXBUtil;
/**
* 测试类的转换
*
*/
public class TestJaxb {
public static void main(String[] args) {
UserRequestDTO userReq=new UserRequestDTO("学jaxb", "13166666666", "430523199211117811");
System.out.println(JAXBUtil.modelToXML(userReq, "GBK", true));
}
}
然后关于enum date 以及组件的处理。
----------------------------------------------------------requestDTO-------------------------------
package com.csdn.request;
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.csdn.adapter.DateAdapter;
import com.csdn.compent.Platform;
import com.csdn.enump.SexEnum;
/**
* 此处模拟用户请求参数 升级版
*
*/
@XmlRootElement(name = "User2") // 根节点名称
public class UserRequestDTO2 implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5755470921262396622L;
private String name;// 必传
// 枚举格式化取值
private SexEnum sex;
private int age;
// 注册时间 日期格式化
private Date registerTime;
private String email;
private String mobile;// 必传
private String idNumber;// 必传
// 对象组件
private Platform platform;// 必传
public String getName() {
return name;
}
@XmlElement(name = "NAME")
public void setName(String name) {
this.name = name;
}
public SexEnum getSex() {
return sex;
}
@XmlElement(name = "SEX")
public void setSex(SexEnum sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
@XmlElement(name = "AGE")
public void setAge(int age) {
this.age = age;
}
public Date getRegisterTime() {
return registerTime;
}
@XmlElement(name = "REGISTERTIME")
@XmlJavaTypeAdapter(DateAdapter.class) // 此处可以格式时间
public void setRegisterTime(Date registerTime) {
this.registerTime = registerTime;
}
public String getEmail() {
return email;
}
@XmlElement(name = "EMAIL")
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
@XmlElement(name = "MOBILE")
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getIdNumber() {
return idNumber;
}
@XmlElement(name = "IDNUMBER")
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public Platform getPlatform() {
return platform;
}
@XmlElement(name = "PLATFORM")
public void setPlatform(Platform platform) {
this.platform = platform;
}
public UserRequestDTO2() {
super();
}
// 必有字段构造函数
public UserRequestDTO2(String name, String mobile, String idNumber) {
super();
this.name = name;
this.mobile = mobile;
this.idNumber = idNumber;
}
// 全参构造函数
public UserRequestDTO2(String name, SexEnum sex, int age, Date registerTime, String email, String mobile,
String idNumber, Platform platform) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.registerTime = registerTime;
this.email = email;
this.mobile = mobile;
this.idNumber = idNumber;
this.platform = platform;
}
@Override
public String toString() {
return "UserRequestDTO2 [name=" + name + ", sex=" + sex + ", age=" + age + ", registerTime=" + registerTime
+ ", email=" + email + ", mobile=" + mobile + ", idNumber=" + idNumber + ", platform=" + platform + "]";
}
}
------------------------------------------------SexEnum枚举-----------------------------------------------
package com.csdn.enump;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
@XmlEnum(String.class)
public enum SexEnum {
@XmlEnumValue("男")MALE("MALE","男"),
@XmlEnumValue("女")FEMALE("FEMALE","女"),
@XmlEnumValue("其他")OTHER("OTHER","其他");
private final String code;
private final String msg;
SexEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 根据编码获取信息
*
* @param code
* @return
*/
public static String getMsgByCode(String code) {
for (SexEnum v : SexEnum.values()) {
if (v.getCode().equals(code)) {
return v.getMsg();
}
}
return "未知结果";
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
-------------------------------------------------------DateAdapter时间格式化处理------
package com.csdn.adapter;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import com.csdn.util.DateUtils;
public class DateAdapter extends XmlAdapter<String, Date> {
@Override
public Date unmarshal(String v) throws Exception {
return DateUtils.formatStringYMD(v);
}
@Override
public String marshal(Date v) throws Exception {
return DateUtils.formatDateYMD(v);
}
}
----------------------------------------------- dateUtils 对应方法------------------------------------
/**
* 将字符串转化为JAVA时间类型。
*
* @param dateStr。字符串。
* @return date。JAVA时间类型。
*/
public static Date formatStringYMD(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try {
return sdf.parse(dateStr);
} catch (Exception e) {
return null;
}
}
public static String formatDateYMD(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format(date);
}
应该很全了。。怎么不能添加demo 附件。。表示很尴尬
有问题请联系邮箱 huangliangchun@163.com
时光逆流,你我不老。一起coding, 一起成长。
--------------------------------------------------------------