Jaxb2에서 JavaBean과 xml의 상호작용을 실현하는 방법 상세 설명

18587 단어 Jaxb2JavaBeanxml
본고는 Jaxb2가 자바빈과 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
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기