通常对接的时候报文协议会给定固定的.xsd后缀的报文规范,我们可以使用jdk自带的xjc来生成指定的java bean文件,使用之前需要将xjc.exe添加到环境变量中,如果这个不会,自己去网上搜一下。环境变量配置。
命令:xjc [.xsd文件目录,如X/test/*.xsd] -p [包名,如com.xx.xx.xx] -d [生成的目标文件夹] -encoding utf-8 [指定解析编码格式]
以上这些都很简单,问题在下面:
如果对生成的都不满意,比如,有好多共有的节点需要提取出来,那么我们就要进行一次封装。这时会出现问题,如:子节点调用的是其他的javaBean,这样生成的子节点中就会带有ns2,ns3之类的前缀。去掉的方法如下:
在javaBean的同级目录下创建文件package-info.java 内容如下。
@javax.xml.bind.annotation.XmlSchema(xmlns={@XmlNs(prefix="",namespaceURI="http://www.chinaport.gov.cn/Exp")})
package com.metinform.hbexpress.net.data;
import javax.xml.bind.annotation.XmlNs;
其中prefix的值就是你想要的前缀,如果不想要则置位空。
之后我们会用到工具类进行xml和javaBean之间的转换。
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* @author jinglonglong
* Jaxb工具类 xml和java类相互转换
* data 2019/4/9
**/
public class JaxbXmlUtil {
public static final String DEFAULT_ENCODING = "UTF-8";
/**
* pojo转换成xml 默认编码UTF-8
*
* @param obj 待转化的对象
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj) throws Exception {
return convertToXml(obj, DEFAULT_ENCODING);
}
/**
* pojo转换成xml
*
* @param obj 待转化的对象
* @param encoding 编码
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj, String encoding) throws Exception {
String result = null;
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setListener(new MarshallerListener());
// 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
return result;
}
/**
* xml转换成JavaBean
*
* @param xml xml格式字符串
* @param t 待转化的对象
* @return 转化后的对象
* @throws Exception JAXBException
*/
@SuppressWarnings("unchecked")
public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
T obj = null;
JAXBContext context = JAXBContext.newInstance(t);
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = (T) unmarshaller.unmarshal(new StringReader(xml));
return obj;
}
}