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的接口中的字符串常量等等,如需处理,需自行添加。