Beanコピーの罠:データが消える!?
「EntityからDTOに値をコピーしたら、データが全部nullになってた…!?」「あれ、なんで保存したはずのフィールドの値が空文字に?」
「source.getName() が null のとき、target.setName(null) が実行されてしまい、既存のデータが消えてしまう。」というのは、Beanのコピー処理などで**nullを上書きしてしまうことによって、target側の元々持っていたデータが失われる**という問題を指しています。
JavaのBeanコピーって便利だけど、知らないとデータ消えます。
Spring BeanUtils.copyProperties public class UserDto { public class 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) |