JAXB 가이드

1. 소개

이것은 JAXB (Java Architecture for XML Binding)에 대한 입문 기사입니다.

먼저 Java 객체를 XML로 또는 그 반대로 변환하는 방법을 보여준 다음 JAXB-2 Maven 플러그인을 사용하여 XML 스키마에서 Java 클래스를 생성하는 방법과 그 반대의 경우에 초점을 맞출 것입니다.

2. 개요

JAXB는 Java 객체를 XML로 마샬링 (쓰기)하고 XML을 객체로 마샬링 (읽기)하는 빠르고 편리한 방법을 제공합니다. Java 주석을 사용하여 XML 요소 및 속성을 Java 필드 및 속성에 매핑하는 바인딩 프레임 워크를 지원합니다.

JAXB-2 Maven 플러그인은 대부분의 작업을 두 개의 JDK 제공 도구 XJC 및 Schemagen 중 하나에 위임합니다.

3. JAXB 주석

JAXB는 생성 된 클래스를 추가 정보로 보강하기 위해 Java 어노테이션을 사용합니다. 이러한 주석을 기존 Java 클래스에 추가하면 JAXB 런타임을 위해 준비됩니다.

먼저 마샬링과 마샬링 해제를 설명하기 위해 간단한 Java 객체를 생성 해 보겠습니다.

@XmlRootElement(name = "book") @XmlType(propOrder = { "id", "name", "date" }) public class Book { private Long id; private String name; private String author; private Date date; @XmlAttribute public void setId(Long id) { this.id = id; } @XmlElement(name = "title") public void setName(String name) { this.name = name; } @XmlTransient public void setAuthor(String author) { this.author = author; } // constructor, getters and setters }

위의 클래스에는 다음 주석이 포함되어 있습니다.

  • @XmlRootElement : 루트 XML 요소의 이름은 클래스 이름에서 파생되며 name 속성을 사용하여 XML의 루트 요소의 이름을 지정할 수도 있습니다.
  • @XmlType : XML 파일에 필드가 기록되는 순서를 정의합니다.
  • @XmlElement : 사용될 실제 XML 요소 이름 정의
  • @XmlAttribute : 요소 대신 속성으로 매핑되는 id 필드 정의
  • @XmlTransient : XML에 포함하고 싶지 않은 필드에 주석 달기

JAXB 주석에 대한 자세한 내용은 다음 링크를 확인하십시오.

4. 마샬링 – 자바 객체를 XML로 변환

마샬링은 클라이언트 애플리케이션에 JAXB 파생 Java 객체 트리를 XML 데이터로 변환하는 기능을 제공합니다. 기본적으로 Marshaller 는 XML 데이터를 생성 할 때 UTF-8 인코딩을 사용합니다. 다음으로 Java 객체에서 XML 파일을 생성합니다.

JAXB 바인딩 프레임 워크 작업을 구현하는 데 필요한 XML / Java 바인딩 정보를 관리하기위한 추상화를 제공하는 JAXBContext 를 사용하여 간단한 프로그램을 만들어 보겠습니다 .

public void marshal() throws JAXBException, IOException { Book book = new Book(); book.setId(1L); book.setName("Book1"); book.setAuthor("Author1"); book.setDate(new Date()); JAXBContext context = JAXBContext.newInstance(Book.class); Marshaller mar= context.createMarshaller(); mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal(book, new File("./book.xml")); }

javax.xml.bind.JAXBContext의 클래스는 JAXB API에 클라이언트의 엔트리 포인트를 제공합니다. 기본적으로 JAXB는 XML 문서를 형식화하지 않습니다. 이렇게하면 공간이 절약되고 공백이 실수로 중요한 것으로 해석되는 것을 방지 할 수 있습니다.

JAXB 형식으로 우리가 간단하게 설정 출력하게하려면 Marshaller.JAXB_FORMATTED_OUTPUT의 에 속성을 true로마샬 . 마샬 메서드는 생성 된 XML을 매개 변수로 저장할 개체와 출력 파일을 사용합니다.

위 코드를 실행할 때 book.xml 에서 결과를 확인하여 Java 객체를 XML 데이터로 성공적으로 변환했는지 확인할 수 있습니다.

  Book1 2016-11-12T11:25:12.227+07:00 

5. 마샬링 해제 – XML을 Java 객체로 변환

언 마샬링은 클라이언트 애플리케이션에 XML 데이터를 JAXB 파생 Java 객체로 변환하는 기능을 제공합니다.

JAXB Unmarshaller 를 사용 하여 book.xml 을 Java 객체로 다시 마샬링 해 보겠습니다 .

public Book unmarshall() throws JAXBException, IOException { JAXBContext context = JAXBContext.newInstance(Book.class); return (Book) context.createUnmarshaller() .unmarshal(new FileReader("./book.xml")); }

위의 코드를 실행할 때 콘솔 출력을 확인하여 XML 데이터를 Java 객체로 성공적으로 변환했는지 확인할 수 있습니다.

Book [id=1, name=Book1, author=null, date=Sat Nov 12 11:38:18 ICT 2016]

6. 복잡한 데이터 유형

JAXB에서 직접 사용할 수없는 복잡한 데이터 유형을 처리 할 때 특정 유형을 관리하는 방법을 JAXB에 표시하는 어댑터를 작성할 수 있습니다.

JAXB의 XmlAdapter를 사용 하여 매핑 할 수없는 클래스를 JAXB가 처리 할 수있는 것으로 변환하는 사용자 지정 코드를 정의 할 수 있습니다. @XmlJavaTypeAdapter의 주석은 확장 어댑터 사용 (때문에) XmlAdapter의 사용자 지정 마샬링에 대한 클래스를.

마샬링 할 때 날짜 형식을 지정하는 어댑터를 만들어 보겠습니다.

public class DateAdapter extends XmlAdapter { private static final ThreadLocal dateFormat = new ThreadLocal() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; @Override public Date unmarshal(String v) throws Exception { return dateFormat.get().parse(v); } @Override public String marshal(Date v) throws Exception { return dateFormat.get().format(v); } }

우리는 마샬링 할 때 DateString 으로 변환하기 위해 " yyyy-MM-dd HH : mm : ss " 날짜 형식 을 사용하고, DateFormat을 스레드로부터 안전하게 만들기 위해 ThreadLocal 을 사용 합니다.

Book에 DateAdapter 를 적용 해 보겠습니다 .

@XmlRootElement(name = "book") @XmlType(propOrder = { "id", "name", "date" }) public class Book { private Long id; private String name; private String author; private Date date; @XmlAttribute public void setId(Long id) { this.id = id; } @XmlTransient public void setAuthor(String author) { this.author = author; } @XmlElement(name = "title") public void setName(String name) { this.name = name; } @XmlJavaTypeAdapter(DateAdapter.class) public void setDate(Date date) { this.date = date; } }

위 코드를 실행할 때 book.xml 의 결과 를 확인하여 새로운 날짜 형식 " yyyy-MM-dd HH : mm : ss "를 사용하여 Java 객체를 XML로 성공적으로 변환했는지 확인할 수 있습니다 .

  Book1 2016-11-10 23:44:18final 

7. JAXB-2 Maven 플러그인

이 플러그인은 JAXB (Java API for XML Binding) 버전 2 이상을 사용하여 XML 스키마 (및 선택적으로 바인딩 파일)에서 Java 클래스를 생성하거나 주석이 달린 Java 클래스에서 XML 스키마를 생성합니다.

웹 서비스를 구축하는 데는 두 가지 기본 접근 방식, Contract LastContract First가 있습니다. 이러한 접근 방식에 대한 자세한 내용은 다음 링크를 확인하십시오.

7.1. XSD에서 Java 클래스 생성

The JAXB-2 Maven plugin uses the JDK-supplied tool XJC, a JAXB Binding compiler tool that generates Java classes from XSD (XML Schema Definition).

Let's create a simple user.xsd file and use the JAXB-2 Maven plugin to generate Java classes from this XSD schema:

Let's configure the JAXB-2 Maven plugin:

 org.codehaus.mojo jaxb2-maven-plugin 2.3   xjc  xjc      src/main/resources/global.xjb   src/main/resources/user.xsd  ${basedir}/src/main/java false  

By default, this plugin locates XSD files in src/main/xsd. We may configure XSD lookup by modifying the configuration section of this plugin in the pom.xml accordingly.

By default, these Java Classes are generated in the target/generated-resources/jaxb folder. We may change the output directory by adding an outputDirectory element to the plugin configuration. We may also add a clearOutputDir element with a value of false to prevent the files in this directory from being erased.

We may also configure a global JAXB binding which overrides the default binding rules:

The global.xjb above overrides the dateTime type to the java.util.Calendar type.

When we build the project, it generates class files in the src/main/java folder and package com.baeldung.jaxb.gen.

7.2. Generating XSD Schema from Java

The same plugin uses the JDK-supplied tool Schemagen. This is a JAXB Binding compiler tool that can generate an XSD schema from Java classes. In order for a Java Class to be eligible for an XSD schema candidate, the class must be annotated with a @XmlType annotation.

We reuse the Java class files from the previous example. Let's configure the plugin:

 org.codehaus.mojo jaxb2-maven-plugin 2.3   schemagen  schemagen      src/main/java/com/baeldung/jaxb/gen  src/main/resources false   /jaxb/gen user user-gen.xsd    

By default, JAXB scans all the folders under src/main/java recursively for annotated JAXB classes. We may specify a different source folder for our JAXB annotated classes by adding a source element to the plug-in configuration.

XSD 스키마 이름을 지정하는 포스트 프로세서 인 transformSchemas를 등록 할 수도 있습니다 . 네임 스페이스 를 Java 클래스 의 @XmlType 네임 스페이스 와 일치시켜 작동합니다 .

프로젝트를 빌드 할 때 src / main / resources 디렉토리 에 user-gen.xsd 파일을 생성합니다 .

8. 결론

이 기사에서는 JAXB에 대한 입문 개념을 다뤘습니다. 자세한 내용은 JAXB 홈페이지를 참조하십시오.

이 기사의 소스 코드는 GitHub에서 찾을 수 있습니다.