BeanUtils.describeを使用してオブジェクトをマップに変換する場合、配列フィールドの値は最初の要素のみを取得します

シナリオ:開発プロセス中に、2つのオブジェクトエンティティの値を比較する必要があります

処理:BeanUtils.describeを使用して、2つのオブジェクトをMapに変換し、データをトラバースして比較します。注:

BeanUtilsはorg.apache.commons.beanutilsの下にあります

質問:BeanUtils.describe変換後のマップの汎用タイプは<String、String>であることがわかりました。この時点で取得されるフィールドが配列タイプの場合、最初の要素のみが取得されます。

解決策:PropertyUtils.describeメソッドを使用して取得したマップの一般的なタイプは<String、Object>です。この時点で、データは正常に取得できます。

BeanUtils.describeとPropertyUtils.describeはどちらも、オブジェクトをマップに変換します。オブジェクトのフィールドに配列またはコレクションタイプがある場合は、PropertyUtils.describeを使用します。

Map <String、String> map = BeanUtils.describe(Object bean);

Map <String、Object> map = PropertyUtils.describe(Object bean);

コードは次のように表示されます。

@Data
public class Person implements Serializable {//实体
 
    /**
     * 
     */
    private static final long serialVersionUID = 3193754045080382621L;
 
    private String            name;
    private Integer           sex;
    private Integer           age;
    private String            school;
    private String[]          hobby;
    private List<String>      place;
 
}

 

  public static void main(String[] args) {//测试
        Person p = new Person();
        p.setName("Akili");
        p.setSex(1);
        p.setAge(24);
        p.setSchool(null);
        p.setHobby(new String[] { "摄影", "旅行", "家居", "做饭" });
        p.setPlace(Lists.newArrayList("北京","深圳","广州","北海"));
 
        Map<String, String> beanLog = new HashMap<String, String>();
        Map<String, Object> propertyLog = new HashMap<String, Object>();
        try {
            beanLog = BeanUtils.describe(p);
        } catch (Exception e) {
            LOG.info("error message", e);
            return;
        }
        try {
            propertyLog = PropertyUtils.describe(p);
        } catch (Exception e) {
            LOG.info("error message", e);
            return;
        }
        if (beanLog != null && propertyLog != null) {
            for (Map.Entry<String, String> entry : beanLog.entrySet()) {
                Map<String, String> temp = new HashMap<String, String>();
                if (entry.getKey().equals("hobby")) {
                    System.out.println("beanLog hobby --- :" + entry.getValue());
                    System.out.println("propertyLog hobby --- :" + Arrays.toString((String[])propertyLog.get(entry.getKey())));
                }
                if(entry.getKey().equals("place")){
                    System.out.println("beanLog place --- :" + entry.getValue());
                    System.out.println("propertyLog place --- :" + propertyLog.get(entry.getKey()));
                }
            }
        }
 
    }

結果:
beanLog place --- BeijingpropertyLog place ---
[Beijing、Shenzhen、Guangzhou、
Beihai ] beanLog hobby ---:photographypropertyLog
hobby ---:[写真、旅行、家庭、料理]

おすすめ

転載: blog.csdn.net/zhangleiyes123/article/details/112311814