Jaxb2에서 JavaBean과 xml의 상호작용을 실현하는 방법 상세 설명
1. 소개
JAXB(Java Architecture for XML Binding)는 업계의 표준으로 XML Schema에 따라 Java 클래스를 생성할 수 있는 기술이다.이 과정에서 JAXB는 XML 인스턴스 문서를 Java 객체 트리로 반대로 생성하는 방법을 제공하고 Java 객체 트리의 내용을 XML 인스턴스 문서에 다시 쓸 수 있습니다.
Jaxb 2.0은 JDK 1.6의 구성 요소입니다.우리는 제3자jar 패키지를 다운로드하지 않아도 쉽게 전환할 수 있다.Jaxb2는 JDK의 새로운 기능을 사용했습니다. 예를 들어 Annotation,Generic Type 등입니다. 변환될 JavaBean에 annotation 주석을 추가해야 합니다.
2. 중요 개념
JAXBContext 클래스는 응용 프로그램의 입구로 XML/Java 귀속 정보를 관리하는 데 사용됩니다.
Java 객체를 XML 데이터로 정렬하는 Marshaller 인터페이스
Unmarshaller 인터페이스에서 XML 데이터를 Java 객체로 역정렬합니다.
XML 모드 유형에 Java 클래스 또는 열거 유형을 매핑하는 @XmlType
@XmlAccessorType(XmlAccessType.FIELD)은 필드나 속성의 서열화를 제어합니다.FIELD는 JAXB가 Java 클래스의 모든 비정적(static), 비순간적(@XmlTransient로 표시됨) 필드를 XML에 자동으로 바인딩한다는 것을 나타냅니다.다른 값은 XmlAccessType도 있습니다.PROPERTY 및 XmlAccessType.NONE.
@XmlAccessorOrder, JAXB 바인딩 클래스의 속성과 필드의 정렬을 제어합니다.
@XmlJavaTypeAdapter, 사용자 정의 어댑터(즉, 추상적인 클래스 XmlAdapter를 확장하고marshal()과 unmarshal() 방법을 덮어씁니다. 자바 클래스를 XML로 서열화합니다.
@XmlElementWrapper, 배열이나 집합(즉 여러 요소를 포함하는 구성원 변수)에 대해 이 배열이나 집합을 포장하는 XML 요소(포장기라고 함)를 생성합니다.
XML 요소에 Java 클래스 또는 열거 유형을 매핑하는 @XmlRootElement
Java 클래스의 속성을 속성과 같은 XML 요소에 매핑하는 @XmlElement
Java 클래스의 속성을 속성과 같은 XML 속성에 매핑하는 @XmlAttribute.
예제
1. 준비 작업
package utils;
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 zhuc
* @create 2013-3-29 2:40:14
*/
public class JaxbUtil {
/**
* JavaBean xml
* UTF-8
* @param obj
* @param writer
* @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
*/
@SuppressWarnings("unchecked")
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;
}
}
아주 간단하고 이해하기 쉬우니 주의해야 할 것은
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
Marshaller.JAXB_FORMATTED_OUTPUT는 xml로 변환할 때 포맷 여부를 결정합니다(즉, 탭에 따라 자동으로 줄을 바꿉니다. 그렇지 않으면 한 줄의 xml)Marshaller.JAXB_ENCODING xml 인코딩 방식
또 Marshaller는 다른 Property를 설정할 수 있고api를 찾아볼 수 있습니다.
2. 가장 간단한 변환
package t1;
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;
/**
* @author zhuc
* @create 2013-3-29 2:49:48
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name = "book", propOrder = { "author", "calendar", "price", "id" })
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;
/**
* @return the author
*/
public String getAuthor() {
return author;
}
/**
* @return the price
*/
public float getPrice() {
return price;
}
/**
* @return the calendar
*/
public Date getCalendar() {
return calendar;
}
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param author the author to set
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* @param price the price to set
*/
public void setPrice(float price) {
this.price = price;
}
/**
* @param calendar the calendar to set
*/
public void setCalendar(Date calendar) {
this.calendar = calendar;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
}
}
package t1;
import java.util.Date;
import javax.xml.bind.JAXBException;
import org.junit.Test;
import utils.JaxbUtil;
/**
* @author zhuc
* @create 2013-3-29 2:50:00
*/
public class JaxbTest1 {
/**
* @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);
}
}
출력 결과는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book id="100">
<author>James</author>
<calendar>2013-03-29T14:50:58.974+08:00</calendar>
<price_1>23.45</price_1>
</book>
Book [author=James, price=23.45, calendar=Fri Mar 29 09:25:56 CST 2013, id=100]
3. 클래스에 포함된 복잡한 대상의 변환
package t2;
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;
/**
* @author zhuc
* @create 2013-3-29 2:51:44
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "student")
@XmlType(propOrder = {})
public class Student {
@XmlAttribute
private Integer id;
@XmlElement
private String name;
@XmlElement(name = "role")
private Role role;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the role
*/
public Role getRole() {
return role;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @param role the role to set
*/
public void setRole(Role role) {
this.role = role;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", role=" + role + "]";
}
}
package t2;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* @author zhuc
* @create 2013-3-29 2:51:52
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "desc" })
public class Role {
@XmlElement
private String name;
@XmlElement
private String desc;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the desc
*/
public String getDesc() {
return desc;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @param desc the desc to set
*/
public void setDesc(String desc) {
this.desc = desc;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Role [name=" + name + ", desc=" + desc + "]";
}
}
package t2;
import org.junit.Test;
import utils.JaxbUtil;
/**
* @author zhuc
* @create 2013-3-29 2:52:00
*/
public class JaxbTest2 {
@Test
public void showMarshaller() {
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 showUnMarshaller() {
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);
}
}
출력 결과는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student id="12">
<name>test</name>
<role>
<name> </name>
<desc> </desc>
</role>
</student>
Student [id=12, name=test, role=Role [name= , desc= ]]
4. 집합 객체의 변환(Set과 동일)
package t3;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* @author zhuc
* @create 2013-3-29 2:55:56
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "country")
@XmlType(propOrder = { "name", "provinceList" })
public class Country {
@XmlElement(name = "country_name")
private String name;
@XmlElementWrapper(name = "provinces")
@XmlElement(name = "province")
private List<Province> provinceList;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the provinceList
*/
public List<Province> getProvinceList() {
return provinceList;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @param provinceList the provinceList to set
*/
public void setProvinceList(List<Province> provinceList) {
this.provinceList = provinceList;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Country [name=" + name + ", provinceList=" + provinceList + "]";
}
}
package t3;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* @author zhuc
* @create 2013-3-29 2:56:03
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "provCity" })
public class Province {
@XmlElement(name = "province_name")
private String name;
@XmlElement(name = "prov_city")
private String provCity;
/**
* @return the provCity
*/
public String getProvCity() {
return provCity;
}
/**
* @param provCity the provCity to set
*/
public void setProvCity(String provCity) {
this.provCity = provCity;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Province [name=" + name + ", provCity=" + provCity + "]";
}
}
package t3;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import utils.JaxbUtil;
/**
* @author zhuc
* @create 2013-3-29 2:56:11
*/
public class JaxbTest3 {
/**
* @throws JAXBException
*/
@Test
public void showMarshaller() {
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 showUnMarshaller() {
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);
}
}
출력 결과는 다음과 같습니다.
<?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 [name= , provinceList=[Province [name= , provCity= ], Province [name= , provCity= ]]]
PS: 여기에서 본 사이트와 관련된 JavaBean 온라인 도구를 추천합니다.온라인 JSON Java Bean 코드 도구:
http://tools.jb51.net/code/json2javabean
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
javaBean의 대상 xml, json 호환시스템과 시스템의 상호작용 사이에 우리가 전송할 때 모두 하나의 텍스트 형식으로 데이터 정보를 전달한다. 다음에 자바빈을 어떻게 json으로 전환하는지 설명하자. json을 자바빈으로 전환하는지 설명한다. 먼저 js...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.