Spring boot项目实现java bean和xml互转
项目场景:
工作中需要给下游第三方收费系统做数据挡板,由于下游系统使用的是soap webservice
,里面涉及各种xml跟bean的互转,在此介绍一下使用的方法。
基于springboot搭建webservice的过程将会在下篇博客介绍
互转方法
这里介绍两种方法.
- 使用
jackson
进行互转,Spring boot
项目自带的json
和bean
的互转的框架,他其实还有xml
与bean
的互转。 - 使用
jaxws
进行xml
与bean
的互转
使用jackson
进行互转
- gradle引入
implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-xml')
- maven 引入
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.5</version>
</dependency>
- 可以做成一个通用的XMLUtils工具类,代码如下:
public static String javaBean2Xml(Object javaBean) throws JsonProcessingException {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
//字段为null就自动忽略,不再序列化
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//XML标签名:使用骆驼命名的属性名,
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE);
//设置转换模式,就是根据getter、setter方法,设置为第一个字母小写这种
xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
return xmlMapper.writeValueAsString(javaBean);
}
public static <T> T Xml2javaBean(String javaBean, Class<T> tClass) throws JsonProcessingException {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
//字段为null,自动忽略,不再序列化
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//XML标签名:使用骆驼命名的属性名,
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE);
//设置转换模式,就是根据getter、setter方法,设置为第一个字母小写这种
xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
return xmlMapper.readValue(javaBean, tClass);
}
- POJO类,后续都会用这个做例子
public class Student {
private String name;
private String teacher;
private Integer age;
....省略构造函数和getter和setter
}
- 测试案例
public static void main(String[] args) throws JsonProcessingException {
Student student = new Student("张三","张老师", 26);
String s = XMLUtils.javaBean2Xml(student);
System.out.println(s);
System.out.println(XMLUtils.Xml2javaBean(s, Student.class));
}
结果:
- 可能会出现的bug
- 如果想给POJO的属性的XML起个别名怎么办,
jackson
是提供了相关的注解。
其他的可以自己尝试下,如果是List的集合的,是以一对多的一对应的,一里面定义了XML节点,就以一里面的定义为主。
-
补充完整的依赖,和
Spring Boot
已经引入的依赖。- 完整依赖
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.13.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.13.5</version> </dependency>
Spring Boot
已经引入的依赖,以2.6.12为例
- 完整依赖
使用jaxws
进行xml
与bean
的互转
- 老规矩,工具类
public static String beanToXml (Object obj, Class<?> zlass) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(zlass);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(obj,writer);
return writer.toString();
}
public static <T> T xmlToBean (String xml, Class<T> zlass) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(zlass);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object object = unmarshaller.unmarshal(new StringReader(xml));
return (T) object;
}
- Marshaller 接口中还定义了5个属性,分别是:
- 代码
public static void main(String[] args) throws Exception {
Student student = new Student("张三","张老师", 26);
String s = XMLUtils.beanToXml(student, Student.class);
System.out.println(s);
System.out.println(XMLUtils.xmlToBean(s, Student.class));
}
- 测试
- 最后补充几个注解