JAX-RS でJSONやXMLを返す
「text/html」ばかり返すのは本来の使い方ではないと思うので今回はXMLとJSONを返すようにしてみる。
XMLやJSONの変換はすべて全自動。JAXB対応しているならすべてやってくれる。
JAXB対応にするためにはbeansに@XmlRootElementアノテーションをつけること、デフォルトコンストラクタがあること。フィールドはセッター・ゲッター用意しても良いし、単なる転送目的ならばpublicフィールドでも良いのはご存知のとおり。
JAXBはJavaEE5仕様のひとつですが、JavaSE6からSEにとりこまれました。手軽に扱えるようになったのはよいですね。
今回作成する内容
サービスとしては2つ作成する
- 得意先名の一覧を返すサービス
- 得意先名から得意先詳細データを返すサービス
JAXB対応Beans
- CustomerList : 得意先名一覧を格納する
- Customer : 得意先名一覧を格納する
サービス CustomerResource.class
- getCustomers() : 得意先一覧を返すサービス
- getCustomer(String name) :得意先詳細を返すサービス
パッケージ構成
たぶんこれ見てもらうのが一番手っ取り早いか。
ソース
CustomerList.java
package jaxrs.jaxb; import java.util.List; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="得意先名一覧") public class CustomerList { public List<String> 一覧; }
Customer.java
package jaxrs.jaxb; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="得意先") public class Customer { public String 名前; public String 住所; }
CustomerResource.java
package jaxrs; import jaxrs.jaxb.Customer; import jaxrs.jaxb.CustomerList; import java.util.ArrayList; import java.util.List; import javax.ws.rs.ProduceMime; import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.PathParam; @Path("/customers") public class CustomersResource { @GET @ProduceMime("application/json") // @ProduceMime("application/xml") public CustomerList getCustomers() { List<String> list = new ArrayList<String>(); list.add("shin"); list.add("shinsan"); list.add("しんさん"); CustomerList result = new CustomerList(); result.一覧 = list; return result; } @Path("{name}") @GET @ProduceMime("application/json") // @ProduceMime("application/xml") public Customer getCustomer(@PathParam("name") String name) { Customer customer = new Customer(); customer.名前 = name; customer.住所 = name +"の住所"; return customer; } }
実行結果
resources/customersへアクセス
{"得意先名一覧":{"一覧":["shin","shinsan","しんさん"]}}
resources/customers/shinsanへアクセス
{"得意先":{"名前":"shinsan","住所":"shinsanの住所"}}
ソースのコメント部分を有効にしてかわりにjsonのほうをコメントにするとxmlが返る。
resources/customersへアクセス
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <得意先名一覧> <一覧>shin</一覧><一覧>shinsan</一覧><一覧>しんさん</一覧> </得意先名一覧>
resources/customers/shinsanへアクセス
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <得意先> <名前>shinsan</名前><住所>shinsanの住所</住所> </得意先>
オブジェクトを転送する場合、わざわざXMLやJSONを生成したりする必要はない。JAXBがすべての入り口になっている。便利。