java:反射工具类去除DTO的String变量前后空格

java:反射工具类去除DTO的String变量前后空格

1 前言

前端表单提交没有处理输入字符的前后空格时,如table查询功能,查询者可能也不易发现,直接使用可能导致数据查询不出来等问题(非like模糊查询时,如精确查询,常出现此类问题)。解决方式除了前端自行处理前后空格,禁用输入框的空格输入等操作外,后端亦可做移除String成员变量前后空格的兜底操作。

2 使用

import org.apache.commons.lang3.ArrayUtils;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.Arrays;

/**
 * @author xiaoxu
 * @date 2022-10-07
 */
public class ReflectUtil {

    /**
     * 移除dto实体类全部非null的String字段的前后空格
     */
    public static<T> T removeDTOSpace(T obj){
        if(obj == null){
            throw new RuntimeException("obj不可以为null");
        }
        // 子类继承父类的字段也加上并处理
        Class<?> temp = obj.getClass();
        Field[] fieldsAll = null;

        while(temp!=null){
            Field[] f = temp.getDeclaredFields();
            fieldsAll = ArrayUtils.addAll(fieldsAll,f);
            temp = temp.getSuperclass();
        }

        if(fieldsAll == null||ArrayUtils.isEmpty(fieldsAll)){
            throw new RuntimeException(MessageFormat.format("obj:{0}的全部字段为空(包括继承父类的成员变量),请检查.",
                    obj));
        }

        Arrays.stream(fieldsAll).forEach(f->{
            if(f.getGenericType().equals(String.class)){
                try{
                    f.setAccessible(true);
                    /* 可能String类型的数据没有赋值,排除为null的 */
                    if(f.get(obj)!=null){
                        f.set(obj,((String)f.get(obj)).trim());
                    }
                }catch (IllegalAccessException e){
                    throw new RuntimeException(e.getMessage(),e.getCause());
                }
            }
        });
        return obj;
    }

}

上述逻辑会将DTO以及其继承的全部父类的成员变量,无论是实例还是类成员变量,public、protected、private或者无权限修饰符的成员变量,只要最底层的子类有其父类对应的public的setter和getter方法,子类实例赋予了相应的String值,那么非null字符串均会去除前后空格。且仅处理前后空格,字符串的中间空格不做处理。

注意:因为static成员变量也会移除前后空格,若业务需求某些字符串常量就是前后必须包含空格的(或者某些实例字符串成员变量也需要前后有空格),此方式不适用,需另做逻辑处理。并且,该方法没有处理implements的接口中的字符串常量等等,如需处理,需自行添加。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值