JAX-RS でJSONやXMLを返す

「text/html」ばかり返すのは本来の使い方ではないと思うので今回はXMLJSONを返すようにしてみる。

XMLJSONの変換はすべて全自動。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の住所</住所>
</得意先>

オブジェクトを転送する場合、わざわざXMLJSONを生成したりする必要はない。JAXBがすべての入り口になっている。便利。