最近工作对接接口出入参均是Xml,因此使用了jaxb来处理
首先先添加依赖:

<!--jaxb-->
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.2.5</version>
</dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.2.5</version>
</dependency><!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version>
</dependency>

工具类:对象转xml与xml转对象

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;public class XmlUtil {// obj需要转换的对象 flag生成xml是否添加头信息public static String objToXml(Object obj, boolean flag) {// 创建输出流StringWriter sw = new StringWriter();try {// 利用jdk中自带的转换类实现JAXBContext context = JAXBContext.newInstance(obj.getClass());Marshaller marshaller = context.createMarshaller();// 格式化xml输出的格式marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");//是否省略xml头信息,默认不省略(false)marshaller.setProperty(Marshaller.JAXB_FRAGMENT, flag);// 将对象转换成输出流形式的xmlmarshaller.marshal(obj, sw);} catch (JAXBException e) {e.printStackTrace();}return sw.toString();}public static <T> T xmlToJson(String xml, Class<T> classType) throws JAXBException {JAXBContext jaxbContext = JAXBContext.newInstance(classType);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();return (T) unmarshaller.unmarshal(new StringReader(xml));}public static Object convertXmlStrToObject(Class clazz, String xmlStr) {Object xmlObject = null;try {JAXBContext context = JAXBContext.newInstance(clazz);// 进行将Xml转成对象的核心接口Unmarshaller unmarshaller = context.createUnmarshaller();StringReader sr = new StringReader(xmlStr);xmlObject = unmarshaller.unmarshal(sr);} catch (JAXBException e) {e.printStackTrace();}return xmlObject;}
}

目标入参例子:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Xml><Head><Version>xxx</Version><SecurityMode>xxx</SecurityMode><CheckSum>xxx</CheckSum><From>xxx</From><To>xxx</To><ChannelCode>xxx</ChannelCode><Customer>xxx</Customer><PoolId>xxx</PoolId><DataFormat>xxx</DataFormat><MessageId>xxx</MessageId><MessageTime>xxx</MessageTime></Head><Request><ApiName>xxx</ApiName><ClientIP>xxx</ClientIP><Parameters><Field>xxx</Field></Parameters></Request>
</Xml>

当前需求如上所示,Head部分是不变的,ApiName内容决定调用哪个接口,
Parameters中对应各个接口需要的参数,但不同接口Parameters里面Field标签是不一样的,如果把所有字段都放一个对象里虽然也能实现功能,但看起来不够雅观,当前采用泛型,但Parameters标签是不变的,因此拼接xml时需要做些调整。

首先是最外层Xml标签:

@Data
@XmlRootElement(name = "Xml")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SectionOfficeRequest.class, ScheduleRequest.class, ExpertRequest.class, PeriodRequest.class, BookingRequest.class, CancelBookingRequest.class})
@XmlType(propOrder = {"headBO", "requestBO", "responseVO"})
public class XmlBO<T> {@XmlElement(name = "Head")private HeadBO headBO;@XmlAnyElement(lax = true)private RequestBO<T> requestBO;@XmlElement(name = "Response")private ResponseVO responseVO;
}

@Data 作用是当前用到了其生成get、set方法
@XmlRootElement 作用是最外层标签是叫xml
@XmlElement 注解加到get方法标明下一节点名称
@XmlAccessorType(XmlAccessType.FIELD) 作用是可以使@XmlElement注解不用加get方法上,简化代码
@XmlSeeAlso、@XmlAnyElement(lax = true) 配套使用,确定泛型可传类型
@XmlType 生成xml顺序

@Data
@XmlRootElement(name = "Head")
@XmlAccessorType(XmlAccessType.FIELD)
public class HeadBO {@XmlElement(name = "Version")private String version;@XmlElement(name = "SecurityMode")private String securityMode;...
}

未完待续…

Java中Jaxb的使用相关推荐

  1. Java 中JAF、CORBA、JTA、JAXB、JAX-WS使用Maven的pom.xml文件配置

    本文主要介绍Java EE中已经弃用的模块,需要单独引用JAF(java.activation).CORBA(java.corba).JTA(java.transaction).JAXB(java.x ...

  2. composition java_阿里P7架构师通过源码浅析Java中的资源加载

    一. 前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 二. 什么是类加载器 虚 ...

  3. java xmladapte_java – Jaxb:全局绑定使用XMLAdapter进行双...

    我有一个元素定义为xsd:double.如果我尝试将一个值285放入元素然后我编组它我得到285.0的输出--那很好.但是,如果我输入一个值285292746,我得到2.85292746E8的输出我是 ...

  4. java中的variable是什么,Java POJO中的field,variable,attribute和property有什么区别?

    从这里: http : //docs.oracle.com/javase/tutorial/information/glossary.html 领域 一个类的数据成员. 除非另外指定,否则字段不是静态 ...

  5. oxygen 生成java对象_利用oxygen编辑并生成xml文件,并使用JAVA的JAXB技术完成xml的解析...

    首先下载oxygen软件(Oxygen XML Editor),目前使用的是试用版(可以安装好软件以后get trial licence,获得免费使用30天的权限,当然这里鼓励大家用正版软件!!!) ...

  6. xml java jaxb_【Java】JAXB操作XML用法详解

    什么是JAXB? JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.在JAX-WS(Java的W ...

  7. Java中字节数组和十六进制字符串之间的转换

    1. 概述 在本教程中,我们将看看将字节数组转换为十六进制字符串,反之亦然的不同方法. 我们还将了解转换机制并编写我们的实现来实现这一点. 2. 字节和十六进制之间的转换 首先,我们来看看字节和十六进 ...

  8. Java中操作Xml使用备忘

    List item 文章目录 Java中操作Xml使用备忘 1. Hutool中XmlUtil的使用简介 2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用] 2 ...

  9. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

最新文章

  1. Linux系统文件类型
  2. QT的QSqlQueryModel类的使用
  3. file is not a zip file_【钢新滨河社团活动】超燃手势舞,牛津A班邀你来battle!
  4. CentOS7下安装Redis — 单节点
  5. 嵌入式软件面试(基础题)总结,不断更新
  6. Vim 命令记录与回放
  7. 自然语言处理基础技术工具篇之NLTK
  8. python 实现数据化大屏_基于Python实现交互式数据可视化的工具(用于Web)
  9. 全球建筑物提取数据集(免费下载):微软/GlobalMLBuildingFootprints
  10. Python笔记:数据切片
  11. 报表工具之ireport
  12. 火车票订票管理系统c语言,基于c 的火车票订票管理系统的设计与实现.docx
  13. 虞美人盛开的山坡片尾曲_さよならの夏_离别的夏天_歌词_带假名及翻译
  14. win11更新安装错误0x80073701解决方法
  15. 在GitHub 上下载指定的文件夹的两种方法
  16. python怎么进入虚拟环境_Python 中如何使用 virtualenv 管理虚拟环境
  17. 破解 geetest(极验)的滑块验证码
  18. java里Math求倒数_java倒数60s实现
  19. 填坑记1-nrf52840出现error flash download failed -cortex-M4错误的解决办法-清风电子开发板
  20. 印象笔记桌面快捷键图标显示不出来,重装无效(win10图文版)

热门文章

  1. 自已动手搭建软件路由器
  2. 安卓--小猴子摘桃APP实现
  3. openfire登录密码忘了
  4. windows不能访问共享文件夹的终极解决办法
  5. CCF小白刷题之路---201812-1 小明上学(C/C++ 100分)
  6. 微信商户平台相关配置指南
  7. docker下的spark集群,调整参数榨干硬件
  8. SQL CREATE TABLE
  9. ARM体系架构中的存储系统
  10. 今日头条“科技”,“娱乐”类文章的抓取