BeanUtils.copyProperties()怎样去掉字段首尾的空格
背景
下午三时许,笔者正戴着耳机听着歌开心的敲着bug,忽然听到办公室的吵架声,原来是ios开发和产品小姐姐吵起来了,为了一个车牌号的校验问题。起因是ios传的车牌号没有将字符串的首尾空格去掉,后端直接使用BeanUtils.copyProperties(source,target)接收值存进了数据库,页面直接显示了带空格的车牌号,测试小姐姐就给ios提了一个bug,就这么简单的一件事,两个人吵得不可开交,最后气的产品小姐姐让ios以后不要和她说话,有问题钉钉上打字说。太刚了这两人。
在这儿想说一下,开发人员其实没必要对bug那么敏感,我的意思是bug我们要重视,但是不要看到bug就开始开始心跳加速,热血沸腾,觉得全世界在与你为敌,我们要抱着良好的心态去沟通问题,解决问题,纵然很多时候有些bug确实让人无语,但何必为了一个bug让自己陷入焦躁和愤怒的状态呢,也容易破坏同事之间的关系,你们说是不是?
言归正传,我们来说说这个问题该怎么解决。
一、客户端解决方案
1、题外话
我觉得前后端开发人员真的没必要经常为了某个参数应该谁校验的问题而争执,我觉得这就像院子门和屋门的关系,前端校验就是院子门,后端是真正能进入屋里的门,院子门上锁是第一道防范和心理安慰,虽然知道别人可以绕过院子门翻墙进来,但是上个锁也总比小偷大摇大摆推开院子门直接进来强吧。然后就是后端,不管院子门锁没锁,你的屋门都要加锁的,要不然门户大开,小偷可不会跟你客气。同样的道理,后端不校验,别人就有一百种方法绕过前端校验,直接将请求打入你的数据库。
2、解决方案
如果本文有客户端的小伙伴看到,不要激动,在传字符串类型值给后端的时候,如果没有特殊要求要求你原值传的话,你应该手动trim一下去掉首尾的空格再传值,这应该是前后端的多年来的默契了吧,举手之劳,会减少很多问题的发生。
二、后端解决方案(本文重点)
1、题外话
很多后端人员会说,都9012年了,我们都是使用工具类BeanUtils.copyProperties(source,target)来直接赋值的,谁还手动先trim()再set(),简直就是回到原始时代。我觉得呢,这样说对也不对,我们这一行人员的开发水平真的是层次不齐,每一天你都可能遇到各种奇葩的问题,在必要的时候,后端人员也要主动加锁的意识,因为可能你院子的主人可能不但不锁院子门,甚至打开到最大就出去潇洒了。那么在这种必要的时候,我们要怎样做呢,怎样让BeanUtils.copyProperties(source,target)中的source里的字符串类型在赋值时已经去掉首尾空格了呢?
2、解决方案
下面是我写的一个工具类,利用反射手动给客户端传来的字符串类型的值去掉首尾空格再赋值,话不多说,直接来看代码。
package com.mazhichu.util; import lombok.Data; import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* <p class="detail">
* 功能: 去掉字符串类型的首尾空格
* </p>
*
* @author Moore
* @ClassName Bean value trim util.
* @Version V1.0.
* @date 2019.11.29 15:53:44
*/
public class BeanValueTrimUtil {
/**
* 去掉bean中所有属性为字符串的前后空格
* @param bean
* @throws Exception
*/
public static void beanValueTrim(Object bean) throws Exception {
if(bean!=null){
//获取所有的字段包括public,private,protected,private
Field[] fields = bean.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
if (f.getType().getName().equals("java.lang.String")) {
String key = f.getName();//获取字段名
Object value = getFieldValue(bean, key); if (value == null)
continue; setFieldValue(bean, key, value.toString().trim());
}
}
}
} /**
* 利用反射通过get方法获取bean中字段fieldName的值
* @param bean
* @param fieldName
* @return
* @throws Exception
*/
private static Object getFieldValue(Object bean, String fieldName)
throws Exception {
StringBuffer result = new StringBuffer();
String methodName = result.append("get")
.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1)).toString(); Object rObject = null;
Method method = null; @SuppressWarnings("rawtypes")
Class[] classArr = new Class[0];
method = bean.getClass().getMethod(methodName, classArr);
rObject = method.invoke(bean, new Object[0]); return rObject;
} /**
* 利用发射调用bean.set方法将value设置到字段
* @param bean
* @param fieldName
* @param value
* @throws Exception
*/
private static void setFieldValue(Object bean, String fieldName, Object value)
throws Exception {
StringBuffer result = new StringBuffer();
String methodName = result.append("set")
.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1)).toString(); /**
* 利用发射调用bean.set方法将value设置到字段
*/
Class[] classArr = new Class[1];
classArr[0]="java.lang.String".getClass();
Method method=bean.getClass().getMethod(methodName,classArr);
method.invoke(bean,value);
} @Data
public static class User{
private String username;
private String password;
private int age;
} public static void main(String[] args) throws Exception {
User user = new User();
user.setUsername(" hehe ");
user.setPassword(" ha ha");
user.setAge(12);
beanValueTrim(user);
}
}
debug看一下效果
这样,是不是就去掉了字符串类型值的首尾空格了,然后你再BeanUtils.copyProperties(source,target)就没问题了。虽然个人觉得这是多余的操作,但有时候人微言轻的时候,你不得不这样做。
好了,本篇文章就讲到这儿,可能有点鸡肋,但这个世界每一天都有很多鸡肋的事在发生,然后你还不得不去面对,希望给遇到这个问题的人能有所帮助。
文章同步公众号:码之初,每天推送Java技术文章,期待您的关注!
原创不易,转载请注明出处,谢谢!
BeanUtils.copyProperties()怎样去掉字段首尾的空格的更多相关文章
- mysql去掉字段字符中间空格
mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数. ...
- BeanUtils.copyProperties 选择性赋值字段
BeanUtils.copyProperties 在字段赋值上有强大的功能,如果有两个的类,如果需要将相同的字段赋值,就可以直接赋制.而不需要每个字段都需要一个一个赋制. BeanUtils.copy ...
- C++去掉字符串首尾的 空格 换行 回车
/* *去掉字符串首尾的 \x20 \r \n 字符 */ void TrimSpace(char* str) { ; char *end = str; char *p = str; while(*p ...
- oracle批量去掉字段值空格
--查询验证 select ltrim(col1) from t1; --去掉字段值左边空格update t1 set col1=ltrim(col1); --去掉字段值右边空格update t1 s ...
- java 使用BeanUtils.copyProperties(Object source,Object target) 复制字段值
BeanUtils.copyProperties(person, wsPerson);把person的字段值,复制给wsPerson // 只复制两个实体中,字段名称一样的 很有用的一个功能...
- 去掉MySQL字段中的空格
mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例: SQL Co ...
- C#中如何实现将字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格
思路:用空来替换首尾的空格,用一个空格替换中间的连续空格. 例如:string inputStr=” xx xx “; inputStr=inputStr.Trim(); inputStr=Regex ...
- 使用BeanUtils.copyProperties踩坑经历
1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...
- BeanUtils.copyProperties() 用法
BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处 ...
随机推荐
- fenby C语言 P23
#include <stdio.h> int main(){ int i,max,a[5]={10,5,20,31,4}; max=a[0]; for(i=0;i<5;i++) if ...
- Modbus协议笔记
读线圈:就是说读开关量输出的状态,看看开关量输出的到底是开着的还是关着的,这样说有点不专业,但是好明白.比如要在上位机显示开关量输出的当状态,就得用这个功能码. 写线圈:就是说读开关量输入的状态,开关 ...
- python3 range 倒序
话不多说上代码,要求简单,从100到1遍历操作. //第三个参数表示的是100所有进行的操作,每次加上-1,直到0 for i in range(100,0,-1): print(i)
- Security整合spring boot
Security整合spring boot 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spri ...
- 20190723_C的三个小实现
1. 有一个字符串开头或结尾含有n个空格(“ abcdefgdddd ”),欲去掉前后的空格,返回一个新的字符串.a) 要求1:请自己定义一个接口(函数),并实现功能:b) 要求2:编写测试 ...
- 转:NFS原理详解
原文:http://atong.blog.51cto.com/2393905/1343950 一.NFS介绍 1)什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS ...
- SCOI2005 繁忙的都市 [Luogu P2330]
题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条 ...
- kettle计划任务
在kettle中固定抽取数据,需要用到kichen命令,编好批处理脚本:bat C: cd C:\soft\kettle\data-integration kitchen /file C:\soft\ ...
- GC四大算法
引言: 前面的文章提到,Heap包括了PSYoungGen.ParOldGen.Metaspace.JVM 在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是新生代.由于新生代 ...
- JVM初体验
一.设计堆内存溢出异常:OutOfMemoryError: public class Main { public static void main(String[] args) { List<D ...