【Java】BeanUtilsを用いたcopyPropertiesフィルタ属性パラメータを含む方法の応用
に質問
需要:更新データのインタフェースに由来し、クラス内のフィールドの値を変更できることが要求されます.一部のみ変更できます.変更されていないフィールドはデフォルトでは変更されません.例では、更新が必要なターゲット下位エンティティpoの拡張サブクラス(このオブジェクトがpoiであると仮定)を含むビューレイヤのパッケージオブジェクトvoが使用され、他の関連属性とは無関係である.フロントエンドからデータが変更されたvoを取得した後、更新されたpoを保存する必要がある.
構想
ignorePropertiesの宣言タイプはString...ignoreProperties
プロパティフィールド名が得られる配列を取得するには、反射メカニズムが必要です.
プロセス poオブジェクトを新規作成し、copyPropertiesを使用してpoiの既存の値の属性をpoにコピーします. は、フィルタ機能の呼び出し のために空でないフィールド名配列を取得する方法を設計する. copyPropertiesのフィルタリロードメソッドを使用して、元のpoを新しいpo にコピーします.
反射取得フィールド名の実装
ターゲットは空でないフィールドを取得することです
上段のコードはプロセスの第2のステップを実現しました
上記のコードの簡単な方法で、より類似した汎用性のあるツールを書くことができます.
需要:更新データのインタフェースに由来し、クラス内のフィールドの値を変更できることが要求されます.一部のみ変更できます.変更されていないフィールドはデフォルトでは変更されません.例では、更新が必要なターゲット下位エンティティpoの拡張サブクラス(このオブジェクトがpoiであると仮定)を含むビューレイヤのパッケージオブジェクトvoが使用され、他の関連属性とは無関係である.フロントエンドからデータが変更されたvoを取得した後、更新されたpoを保存する必要がある.
構想
BeanUtils.copyProperties(source, target, ignoreProperties)
という方法で、ソースの属性を、属性名の一部をフィルタリングし、ターゲットにコピーします.ignorePropertiesの宣言タイプはString...ignoreProperties
プロパティフィールド名が得られる配列を取得するには、反射メカニズムが必要です.
プロセス
反射取得フィールド名の実装
ターゲットは空でないフィールドを取得することです
/**
* vo itemsCustom
* @param objClass Class , Class , vo
* @param vo
* @return
* @throws ClassNotFoundException
*/
private String[] getProperties(Class objClass,ItemsQueryVo vo) throws ClassNotFoundException {
// ItemsCustom class
ItemsCustom obj = vo.getItemsCustom();
List<String> properties = new ArrayList<>();
//
try {
// getDeclaredFields() getFields()
// objClass ,
// obj.getClass() , obj objClass
for(Field field: objClass.getDeclaredFields()) {
// private
field.setAccessible(true);
//
if(field.get(obj)!=null)
properties.add(field.getName());
}
}catch (Exception e) {
/*
* ,return null
* , ,
*/
return null;
}
//
String[] propers = new String[properties.size()];
return properties.toArray(propers);
}
上段のコードはプロセスの第2のステップを実現しました
上記のコードの簡単な方法で、より類似した汎用性のあるツールを書くことができます.