tamuraです。

前回の続きです。
 

JavaBeansを使うとこんなに便利!という例をいくつかあげてみます。

  • XMLの読み込み
  • JSONの読み込み
  • JSONの書き出し 


XMLの読み込み

XMLで定義した情報をJavaに読み込む際に、JavaBeansで定義しておくと簡単に読み込みができます。

このようなXMLで定義されたデータがあった場合、

<?xml version="1.0" encoding="utf-8"?>
<product-info>
  <products>
    <product>
      <name>Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本</name>
      <isbn>978-4873112497</isbn>
      <asin></asin>
    </product>
    <product>
      <name>LAMY ラミー 4色 ボールペン 2000 L401 正規輸入品</name>
      <isbn></isbn>
      <asin>B000UTKMDQ</asin>
    </product>
  </products>
</product-info>

このようなJavaBeansを定義します。

import java.net.URL;
import java.util.List;

import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRooElement;

@XmlRootElement
public class ProductInfoBean implements java.io.Serializable {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    public static ProductInfoBean readXML(String filename) {
        URL f = ProductInfoBean.class.getClassLoaer().getResource(filename);
        return JAXB.unmarshal(f, ProductInfoBean.class);
    }

    private List<ProdutBean> products;

    public ProductInfoBean() {
    }

    @XmlElementWrapper(name = "products")
    @XmlElement(name = "product")
    public List<ProductBean> getProducts() {
        return this.products;
    }
    public void setProducts(List<ProductBean> products) {
        this.products = products;
    }

    public static class ProductBean implements java.io.Serializable {
        /** serialVersionUID */
        private static final long serialVersionUID = 1L;

        private String name;
        private String isbn;
        private String asin;

        @XmlElement(name = "name")
        public String getName() {
            return this.name;
        }
        public void setName(String name) {
            this.name = name;
        }

        @XmlElement(name = "isbn")
        public String getIsbn() {
            return this.isbn;
        }
        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }

        @XmlElement(name = "asin")
        public String getAsin() {
            return this.asin;
        }
        public void setAsin(String asin) {
            this.asin = asin;
        }
    }
}

使い方は簡単で、

ProductInfoBean bean = ProductInfoBean.readXML("data.xml");

とすることで、XMLの中身がセットされたBeanのインスタンスが生成されます。

JSONの読み込み

Webサービスを作る際に、フロントとのやりとりにJSONを使うことがあります。

{
  name: 'Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本',
  isbn: '978-4873112497'
}

このJSONをJavaBeansに変換して受け取れるようにします。

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.Setter;

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

import com.faserxml.jackson.annotation.JsonCreator;
import com.faserxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
@XmlRootElement
public class ProductBean implements java.io.Serializable {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    @Getter
    @Setter
    private String name;
    @Getter
    @Setter
    private String isbn;
    @Getter
    @Setter
    private String asin;

    public ProductBean() {
    }

    public ProductBean(@JsonProperty("name") String name,
            @JsonProperty("isbn") String isbn,
            @JsonProperty("asin") String asin) {
        this.name = name;
        this.isbn = isbn;
        this.asin = asin;
    }
}

サービスの受け口はこんな感じになります。 これはJerseyで動かす想定です。

import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("/product")
public class ProductService {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String registProduct(@Valid ProductBean request) {
        return "ok!";
    }
}

JSONの書き出し

フロントにAngularJSなどを使っていると、フロントとバックエンドのやりとりはJSONだと扱いやすいです。 フロントにJSONを返す方法をやってみます。

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.Setter;

@XmlRootElement
public class ResponseBean implements java.io.Serializable {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    @Getter
    @Setter
    private Sring result;
    @Getter
    @Setter
    private ProductBean product;

    public static class ProducBean implements java.io.Serializable {
        /** serialVersionUID */
        private static final long serialVersionUID = 1L;

        @Getter
        @Setter
        private String name;
        @Getter
        @Setter
        private String isbn;
        @Getter
        @Setter
        private String asin;
    }
}

こんなJavaBeansを用意するとこんなJSONが返る想定です。

{
  result: 'ok',
  product: {
    name: 'Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本',
    isbn: '978-4873112497',
    asin: null
  }
}

さきほどのWebサービスに組み込みます。

import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/product")
public class ProductService {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public ResponseBean registProduct(@Valid ProductBean request) {
        ResponseBean response = new ResponseBean();
        response.setResult("ok");
        ResponseBean.ProductBean product = new ResponseBean.ProductBean();
        product.setName("Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本");
        product.setIsbn("978-4873112497");
        response.setProduct(product);

        return response;
    }
}

まとめ

現在のJavaBeansはPOJO(Plain Old Java Object)として単なるValueObjectとして扱われることが多いですが、 その分さまざまなデータ形式とやり取りできるので、 データ構造はシンプルにいきたいものです。