JAXBを試してみる。
最近、読み始めたこの本に触発されてJAXBを試してみました。
- 作者: Bill Burke,arton,菅野良二
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/08/23
- メディア: 大型本
- 購入: 28人 クリック: 772回
- この商品を含むブログ (35件) を見る
今の僕の気分としては、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ではデフォルトで使えるのかな、未確認。