一般社団法人 全国個人事業主支援協会

COLUMN コラム

Beanコピーの罠:データが消える!?

「EntityからDTOに値をコピーしたら、データが全部nullになってた…!?」「あれ、なんで保存したはずのフィールドの値が空文字に?」

「source.getName() が null のとき、target.setName(null) が実行されてしまい、既存のデータが消えてしまう。」というのは、Beanのコピー処理などで**nullを上書きしてしまうことによって、target側の元々持っていたデータが失われる**という問題を指しています。

JavaのBeanコピーって便利だけど、知らないとデータ消えます。

  • サンプルコード(落とし穴)

Spring BeanUtils.copyProperties

public class UserDto {
private String name; // null
private Integer age = 25;
}

public class UserEntity {
private String name = “田中”;
private Integer age = 20;
}

// コピー処理
BeanUtils.copyProperties(userDto, userEntity);

  • 出力結果
userEntity.name → null に上書きされる!!
userEntity.age → 25(これはOK)

なぜこうなるのか?
Springの BeanUtils.copyProperties の仕様
null値もそのままコピーされる(null→上書き)
対応するプロパティのgetter/setterが両方ある場合のみ有効
型変換はされない(String ↔ DateはNG)

回避策
1. nullをコピーしたくない ⇒ Hutoolの BeanUtil

BeanUtil.copyProperties(dto, entity,CopyOptions.create().ignoreNullValue());

2. コピー対象を絞りたい ⇒ MapStructや手動指定もアリ

// MapStructなら明示的にフィールド指定できる
@Mapping(target = “name”, ignore = true)

 

The following two tabs change content below.

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア