問題現象:
今日のプロジェクトで使用
BeanUtils.copyProperties(userInfo, bladeUserVo);
コピーのすべての属性値にユーザ情報オブジェクトを属性と同じ名前のbladeUserVoオブジェクト。しかし、失敗しました。
問題分析:
コードを見ると、次のことがわかります。
@Getterおよび@Setterコメントのlombokプラグで使用されるエンティティクラスの元のオブジェクトのため。
そして、BeanUtils.copyProperties(A、B);最初にAオブジェクトでgetterメソッドとsetterメソッドを見つけ、次にBオブジェクトでgetterメソッドとsetterメソッドを見つけ、対応するメソッドをプロパティ名で照合して、プロパティ値のコピー、
ただし、lombokプラグインのみを使用した後、Aオブジェクトのgetterメソッドとsetterメソッドの処理ロジックが変更されます。これは、元のJavaロジックとは異なります。
lombokプラグアレンジされた@Accessors(chain = true)アノテーション、アノテーションは、元のvoidから属性タイプ(String、int、Integerなど)まで、オブジェクトの値を返すセッターメソッドとして機能できます。
解決:
1. lombokプラグインを使用しないでください:
実際、lombokプラグインはコードを便利に見せますが、getter / setterメソッドのロジックはあまり変更されていないため、パッケージ化後は大きくなりますが、追加のプラグイン依存関係パッケージがあります。
ゲッター/セッターメソッドを自分で手動で定義することをお勧めします。また、一部のメソッド(BeanUtils.copyProperties(A、B)など)の互換性の問題を回避することもできます。実際、古いIDEAドライバーはショートカットキーがあることを知っています( Alt + Insert)エンティティクラスを直接生成する getter / setter / toString / constructorなどの メソッドはlombokよりも時間がかかりません。
2. Aオブジェクトで使用する必要のあるプロパティのgetterメソッドを呼び出し、Bオブジェクトに対応するsetterメソッドを同じ名前のBオブジェクトのプロパティに1つずつ割り当てます。
3.ロジックを変更します。特定の動作原理と例については、この大物(複製)のリンクを確認できます。