##前言
因项目需要,需要将一个复杂的对象(包括对象及对象集合)转化为json,xml.并组装通过HttpClient发送post请求的json,xml,soap格式报文。在解析xml时选择采用JAXB,能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON。
##dto对象(包括对象以及对象集合)
《一》相关注解详解:
①:@XmlRootElement(name = “orderRelease”) 注解是指定xml的根节点,作用在类上
②:@XmlAccessorType
@XmlAccessorType 用于指定有java对象生成xml文件时对java对象属性的访问方式。 它的属性值是XmlAccessType的四个枚举值。分别是:
XmlAccessType.FIELD
其中XmlAccessType.FIELD java 对象中的所有成员变量
XmlAccessType.PROPERTY java对象中所有通过getter/setter 方式访问的成员变量。
XmlAccessType.PUBLIC_MEMBER java 对象中所有的public 访问权限的成员变量和通过getter/setter方式访问的成员变量 。
XmlAccessType.NONE java对象的所有属性都不映射为XML元素
(注:在我们这里我只用到了XmlAccessType.FIELD)
③:@XmlType(propOrder = { “orderMain”, “orderItemList”}) 因为xml在默认情况下,Jaxb编组出来的xml中的字段顺序是随机的,你可以使用@XmlType的propOrder属性来指定序列化的顺序。
④:@XmlElement该注解用在java类的属性上。用于将属性映射为xml的子节点,可通过在后面配置name属性值类改变java属性在xml文件中的名称。例如:
@XmlElement(name = "orderMain")
private OrderMain orderMain;
@XmlElementWrapper(name="orderItems")
@XmlElement(name = "orderItem")
private List<OrderItem> orderItemList;
最后需要注意的是集合以及子对象里也会用到上述注解,请大家自行查看。
⑤:@XmlAccessorOrder
用于对java 对象生成的xml元素进行排序。它有两个属性值:
AccessorOrder.ALPHABETICAL:对生成的xml元素按字母顺序排序;
XmlAccessOrder.UNDEFINED:不排序
⑥:@XmlTransient
用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。
⑦:@XmlElementWrapper
在注解最外面再加一层,可用于POJO中包含List的属性中
《二》dto对象(省略get,set方法)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "orderRelease")
@XmlType(propOrder = { "orderMain", "orderItemList","projectCode"})
public class OrderRelease {
@XmlElement(name = "orderMain")
private OrderMain orderMain;
@XmlElementWrapper(name="orderItems")
@XmlElement(name = "orderItem")
private List<OrderItem> orderItemList;
@XmlElement(name = "projectCode")
private String projectCode;
《三》dto对象里的javaBean对象(省略get,set)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"id","messageId","orderName","orderCode","orderRemark","orderPublishTime","orderPublishTimeBegin","orderPublishTimeEnd","createUserName","createUserCode","orderTotalPrice","arriveTime","arriveTimeBegin","arriveTimeEnd","addressUserName","addressName","addressPhone","supplierId","supplierName","supplierUserName","supplierPhone","orderSource","projectName","cargoDismantleComment"})
public class OrderMain implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* @描述:主键id
* @字段:id BIGINT(19)
*/
@XmlElement
private Long id;
/**
* @描述:消息ID
* @字段:message_id BIGINT(19)
*/
@XmlElement
private Long messageId;
/**
* @描述:订单名称
* @字段:order_name VARCHAR(100)
*/
@XmlElement
private String orderName;
/**
* @描述:订单编号
* @字段:order_code VARCHAR(50)
*/
@XmlElement
private String orderCode;
/**
* @描述:订单备注
* @字段:order_remark VARCHAR(500)
*/
@XmlElement
private String orderRemark;
/**
* @描述:订单发布时间
* @字段:order_publish_time DATETIME(19)
*/
@XmlElement
@XmlJavaTypeAdapter(DefaultDateXmlAdapter.class)
private java.util.Date orderPublishTime;
/** 非数据库字段,查询时使用 */
@XmlElement
@XmlJavaTypeAdapter(DefaultDateXmlAdapter.class)
private java.util.Date orderPublishTimeBegin;
/** 非数据库字段,查询时使用 */
@Xml