【开发新的】apache common BeanUtils忽略null值

前言: BeanUtils默认的populate方法不会忽略空值和null值,在特定场景,我们需要原始的值避免被覆盖,所以这里提供一种自定义实现方式。

java 复制代码
package com.hmwl.service.program;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.ContextClassLoaderLocal;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @Author: martin
 * @Date: 2023/11/01 15:13 pm
 * @Description: apache common 原版populate不会过滤null值,不符合使用场景
 */
@Slf4j
public class CustomBeanUtils extends BeanUtilsBean {
    private static final ContextClassLoaderLocal<CustomBeanUtils>
            BEANS_BY_CLASSLOADER = new ContextClassLoaderLocal<CustomBeanUtils>() {
        // Creates the default instance used when the context classloader is unavailable
        @Override
        protected CustomBeanUtils initialValue() {
            return new CustomBeanUtils();
        }
    };

    public static CustomBeanUtils getInstance() {
        return BEANS_BY_CLASSLOADER.get();
    }

    public static void setInstance(final CustomBeanUtils newInstance) {
        BEANS_BY_CLASSLOADER.set(newInstance);
    }

    public static void populateIgnoreEmpty(final Object bean, final Map<String, ? extends Object> properties) {
        try {
            CustomBeanUtils.getInstance().populateIgnoreNull(bean, properties);
        } catch (IllegalAccessException e) {
            log.error(e.getMessage());
        } catch (InvocationTargetException e) {
            log.error(e.getMessage());
        }
    }

    private final void populateIgnoreNull(final Object bean, final Map<String, ? extends Object> properties)
            throws IllegalAccessException, InvocationTargetException {
        if ((bean == null) || (properties == null)) {
            return;
        }
        if (log.isDebugEnabled()) {
            log.debug("BeanUtils.populate(" + bean + ", " +
                    properties + ")");
        }
        for (final Map.Entry<String, ? extends Object> entry : properties.entrySet()) {
            final String name = entry.getKey();
            // 增强下,因为可能多次调用,当value为null的时候不赋值
            if (name == null || entry.getValue() == null) {
                continue;
            }
            setProperty(bean, name, entry.getValue());
        }
    }
}

原版实现:

java 复制代码
    public void populate(final Object bean, final Map<String, ? extends Object> properties)
        throws IllegalAccessException, InvocationTargetException {

        // Do nothing unless both arguments have been specified
        if ((bean == null) || (properties == null)) {
            return;
        }
        if (log.isDebugEnabled()) {
            log.debug("BeanUtils.populate(" + bean + ", " +
                    properties + ")");
        }

        // Loop through the property name/value pairs to be set
        for(final Map.Entry<String, ? extends Object> entry : properties.entrySet()) {
            // Identify the property name and value(s) to be assigned
            final String name = entry.getKey();
            if (name == null) {
                continue;
            }

            // Perform the assignment for this property
            setProperty(bean, name, entry.getValue());

        }

    }
相关推荐
折哥的程序人生 · 物流技术专研12 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang13 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅15 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_15 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ198715 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码15 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby16 小时前
Spring Security
java·后端·spring
IT笔记16 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
我才是银古17 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
TPBoreas17 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言