1、jaxb2实现JavaBean与xml互转
1.1、工具类
package com.example.springsecuritydemo.jaxb2;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* Jaxb2工具类
* @author swq
* @create 2021-04-19 21:46
*/
public class JaxbUtil {
/* *
* JavaBean转换成xml
* 默认编码UTF-8
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
return convertToXml(obj, "UTF-8");
}
/* *
* JavaBean转换成xml
* @param obj
* @param encoding
* @return
*/
public static String convertToXml(Object obj, String encoding) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/* *
* xml转换成JavaBean
* @param xml
* @param c
* @return
*/
public static <T> T converyToJavaBean(String xml, Class<T> c) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
1.2、测试类
package com.example.springsecuritydemo;
import com.example.springsecuritydemo.jaxb2.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.xml.bind.JAXBException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SpringBootTest
class SpringsecuritydemoApplicationTests {
@Test
void contextLoads() {
}
/**
* @throws JAXBException
*/
@Test
public void showMarshaller() {
Book book = new Book();
book.setId(100);
book.setAuthor("James");
book.setCalendar(new Date());
book.setPrice(23.45f); //默认是0.0
String str = JaxbUtil.convertToXml(book);
System.out.println(str);
}
/**
* @throws JAXBException
*/
@Test
public void showUnMarshaller() {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<book id=\"100\">" +
" <author>James</author>" +
" <calendar>2013-03-29T09:25:56.004+08:00</calendar>" +
" <price_1>23.45</price_1>" +
"</book>";
Book book = JaxbUtil.converyToJavaBean(str, Book.class);
System.out.println(book);
}
@Test
public void showMarshaller1() {
Student student = new Student();
student.setId(12);
student.setName("test");
Role role = new Role();
role.setDesc("管理");
role.setName("班长");
student.setRole(role);
String str = JaxbUtil.convertToXml(student);
System.out.println(str);
}
@Test
public void showUnMarshaller1() {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
"<student id=\"12\">"+
" <name>test</name>"+
" <role>"+
" <name>班长</name>"+
" <desc>管理</desc>"+
"</role>"+
"</student>";
Student student = JaxbUtil.converyToJavaBean(str, Student.class);
System.out.println(student);
}
/**
* @throws JAXBException
*/
@Test
public void showMarshaller2() {
Country country = new Country();
country.setName("中国");
List<Province> list = new ArrayList<Province>();
Province province = new Province();
province.setName("江苏省");
province.setProvCity("南京市");
Province province2 = new Province();
province2.setName("浙江省");
province2.setProvCity("杭州市");
list.add(province);
list.add(province2);
country.setProvinceList(list);
String str = JaxbUtil.convertToXml(country);
System.out.println(str);
}
/**
*
*/
@Test
public void showUnMarshaller2() {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
"<country>"+
" <country_name>中国</country_name>"+
" <provinces>"+
" <province>"+
" <province_name>江苏省</province_name>"+
" <prov_city>南京市</prov_city>"+
" </province>"+
" <province>"+
" <province_name>浙江省</province_name>"+
" <prov_city>杭州市</prov_city>"+
" </province>"+
" </provinces>"+
"</country>";
Country country = JaxbUtil.converyToJavaBean(str, Country.class);
System.out.println(country);
}
}
1.3、实体类
package com.example.springsecuritydemo.jaxb2;
import lombok.Data;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name = "book", propOrder = { "author", "calendar", "price", "id" })
@Data
public class Book {
@XmlElement(required = true)
private String author;
@XmlElement(name = "price_1", required = true)
private float price;
@XmlElement
private Date calendar;
@XmlAttribute
private Integer id;
}
package com.example.springsecuritydemo.jaxb2;
import lombok.Data;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "country")
@XmlType(propOrder = { "name", "provinceList" })
@Data
public class Country {
@XmlElement(name = "country_name")
private String name;
@XmlElementWrapper(name = "provinces")
@XmlElement(name = "province")
private List<Province> provinceList;
}
package com.example.springsecuritydemo.jaxb2;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "provCity" })
@Data
public class Province {
@XmlElement(name = "province_name")
private String name;
@XmlElement(name = "prov_city")
private String provCity;
}
package com.example.springsecuritydemo.jaxb2;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "desc" })
@Data
public class Role {
@XmlElement
private String name;
@XmlElement
private String desc;
}
package com.example.springsecuritydemo.jaxb2;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "student")
@XmlType(propOrder = {})
@Data
public class Student {
@XmlAttribute
private Integer id;
@XmlElement
private String name;
@XmlElement(name = "role")
private Role role;
}