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として扱われることが多いですが、 その分さまざまなデータ形式とやり取りできるので、 データ構造はシンプルにいきたいものです。