読者です 読者をやめる 読者になる 読者になる

Murayama blog.

プログラミングと、その次の話

JAXBを試してみる。

最近、読み始めたこの本に触発されてJAXBを試してみました。

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築


今の僕の気分としては、JAX-RSでアプリを作るのが目的なのですが、その布石としてJAXBも触ってみたかんじです。
ちなみに僕とJAXBとの出会いは入社2年目の若かりし頃、、
では、はりきって参りましょう。

JavaオブジェクトをXMLデータにマーシャリング

マーシャル(marshal)ってのは整理するとか、並ばせるとかの意味で、
JavaのオブジェクトをXMLデータに変換する、ということをやってみます。


たとえば、本を表すBookクラスを作ります。
このクラスは本の名前nameと価格priceをフィールドに持ちます。

package murayama333.resources;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Book {
	
	private String name;
	
	private Integer price;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
}

クラスに付いている@XMLRootElementというアノテーションがポイントです。
@XMLRootElementを付けることで、このクラスはXMLのルート要素になりますよ、って意味になります。
(@XMLRootElementアノテーションはJAXBによって提供されます)
ほんとはもっといろんなアノテーションで装飾できるようですが、
ここでは動けばいいやレベルの最小限設定にしています。


で、このBookクラスをnewすることでオブジェクトを生成しJavaプログラムの中で扱うことになります。
JAXBを使って、BookオブジェクトをXMLファイルに変換するには次のようにします。

package murayama333.resources;

import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class Main {

	public static void main(String[] args) {
		
		Book book = new Book();
		book.setName("book name");
		book.setPrice(2000);
		
		try {
			JAXBContext context = JAXBContext.newInstance(Book.class);
			
			StringWriter writer = new StringWriter();
			
			context.createMarshaller().marshal(book, writer);
			
			System.out.println(writer.toString());
			
		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

JAXBContextを作ってそこにBookオブジェクトとStringWriterを渡してやります。
そうすると実行結果は、

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><book><name>book name</name><price>2000</price></book>

XMLデータになります。めでたしめでたし。

JAXBのインストール

Java1.5環境なのでMavenを使ってインストールしました。*1
pom.xmlに以下を記述します。

		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
			<version>2.2.1</version>
		</dependency>

以上、おしまい。

*1:Java6ではデフォルトで使えるのかな、未確認。