ヒトリ歩き

愚痴とかいろいろ書きます

BeanクラスをコピーするBeanUtilsクラスがあるのを知ってますか?

はじめに

BeanクラスのコピーをすることができるBeanUtilsクラスをSpringFrameworkが提供していることを知ったので、使ってみる。

spring.pleiades.io

Beanクラスのコピーをやってみる

BeanクラスのコピーはBeanUtilsクラスのcopyPropertiesメソッドを使用して行う。
第1パラメータにコピー元のクラスのオブジェクトを指定し、第2パラメータにコピー先のクラスのオブジェクトを指定する。
例の場合はProductクラスのオブジェクトの値をProductDtoクラスのオブジェクトに値をコピーすることができる。

Product product = new Product(1111,2222,"test",1000,"happy happy");
ProductDto dto = new ProductDto();

BeanUtils.copyProperties(product, dto);

Setter、Getterメソッドが必要

BeanUtilsクラスのcopyPropertiesメソッドを使用する場合、コピー元にはフィールドのGetterメソッド、コピー先にはフィールドのSetterメソッドが用意されていないと値がコピーされない。

Listのコピーは?

Beanクラスをコピーした後に、コピー元のListクラスのListクラスに要素を追加するとコピー先のListも更新された。
オブジェクトに関しては参照先がコピーされただけということがわかる。(シャローコピー)

最後に

BeanUtilsでBeanクラスのコピーメソッドが用意されていることは知らなかった。
他にも使えそうなユーティリティクラスがあるかもしれないので、SpringFrameworkのJavadocを見てみようと思う。
ただ、便利だからといって使い方を間違えるとバグにつながるので、内容を確認した上で使用しようと思う。

参考

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;

import jp.sample.resttemplate.model.Product;
import jp.sample.resttemplate.model.ProductDto;

public class Main {

    private static Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        Product product = new Product(1111,2222,"test",1000,"happy happy", list);
        ProductDto dto = new ProductDto();

        BeanUtils.copyProperties(product, dto);

        logger.info("=============================");
        logger.info("product = {}", product.toString());
        logger.info("dto = {}", dto.toString());

        product.add("bb");

        logger.info("=============================");
        logger.info("product = {}", product.toString());
        logger.info("dto = {}", dto.toString());


    }

}
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@ToString
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    
    /**
     * 商品コード
     */
    @JsonProperty("productCode")
    private int productCode = 0;
    
    /**
     * 仕入れ先コード
     */
    @JsonProperty("supplierCode")
    private int supplierCode = 0;
    
    /**
     * 商品名
     */
    @JsonProperty("productName")
    private String name = null;
    
    /**
     * 価格
     */
    @JsonProperty("productPrice")
    private int price = 0;
    
    /**
     * メーカー
     */
    @JsonProperty("maker")
    private String maker = null;
    
    private List<String> list;
    
    public void add(String a) {
        list.add(a);
    }

}
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@ToString
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ProductDto {

    /**
     * 商品コード
     */
    @JsonProperty("productCode")
    private int productCode = 0;
    
    /**
     * 仕入れ先コード
     */
    @JsonProperty("supplierCode")
    private int supplierCode = 0;
    
    /**
     * 商品名
     */
    @JsonProperty("productName")
    private String name = null;
    
    /**
     * 価格
     */
    @JsonProperty("productPrice")
    private int price = 0;
    
    /**
     * メーカー
     */
    @JsonProperty("maker")
    private String maker = null;
    
    private List list;
}