Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

BeanUtils.copyPropertiesによるフィールド値コピー

後輩が使ってたコードをネタとして拝借(^^;

うちでは案件管理システムなどの開発が多いのですが、業務の中で

「見積が確定して受注した際、見積の情報を受注へと引き継ぐ」

みたいなのが結構あったりします。

そんなときに見積のEntityが持つ属性情報から1つ1つ受注Entityに入れていく…みたいなことをする場合もあったりするのですが、BeanUtils使うと、簡単にプロパティ情報をコピーできて便利でした。

既に色々情報あって参考にさせて頂きました。こんなのあるなんて知らなかった(>_<;

Maven使っていればpom.xmlに以下依存性を定義するだけ。

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.1</version>
</dependency>

ちょっとしたお試しコード書いてみました。
JPAのEntityではなく、とりあえず普通のクラスです。
(Lombok使ってます)

/**
 * 見積の情報クラス
 */
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Quote{
    private String quoteId;
    private String name;
    private String customerId;
    private BigDecimal quotePrice;
}
/**
 * 受注の情報クラス
 */
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order{
    private String orderId;
    private String name;
    private String customerId;
}

で、見積のインスタンス作って、属性にも値をセット。
受注のインスタンス作ってBeansUtils.copyPropertiesで属性コピー

Quote quote = new Quote("quote1", "見積1", "hogehoge",new BigDecimal(3000));
Order order = new Order();

//見積のプロパティを受注へコピー
BeanUtils.copyProperties(order, quote);
System.out.println(quote);
System.out.println(order);

標準出力結果は以下

Quote(quoteId=quote1, name=見積1, customerId=hogehoge, quotePrice=3000)
Order(orderId=null, name=見積1, customerId=hogehoge)

プロパティ名が一致する部分だけコピーされてます。便利。
内部的にはリフレクションとか使ってるのかな?一度コードリーディングしてみたい気も。

前にディープコピーを実装したとき、Dozerとか使ったけど、これ使うのもありかなと思ったり。

というか、オフショア先のコードで、エンティティをディープコピーする際、自前で単純にnewした後、ひたすらコピー元のフィールド値を延々とセットし続けるコードを前にみたのだけど、これ使えば1行で書けるし、属性増えたときも改造いらないんだけどなぁ…。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村