背景

下午三时许,笔者正戴着耳机听着歌开心的敲着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()怎样去掉字段首尾的空格的更多相关文章

  1. mysql去掉字段字符中间空格

    mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数.   ...

  2. BeanUtils.copyProperties 选择性赋值字段

    BeanUtils.copyProperties 在字段赋值上有强大的功能,如果有两个的类,如果需要将相同的字段赋值,就可以直接赋制.而不需要每个字段都需要一个一个赋制. BeanUtils.copy ...

  3. C++去掉字符串首尾的 空格 换行 回车

    /* *去掉字符串首尾的 \x20 \r \n 字符 */ void TrimSpace(char* str) { ; char *end = str; char *p = str; while(*p ...

  4. oracle批量去掉字段值空格

    --查询验证 select ltrim(col1) from t1; --去掉字段值左边空格update t1 set col1=ltrim(col1); --去掉字段值右边空格update t1 s ...

  5. java 使用BeanUtils.copyProperties(Object source,Object target) 复制字段值

    BeanUtils.copyProperties(person, wsPerson);把person的字段值,复制给wsPerson // 只复制两个实体中,字段名称一样的 很有用的一个功能...

  6. 去掉MySQL字段中的空格

    mysql replace 函数   语法:replace(object,search,replace)   意思:把object中出现search的全部替换为replace   案例: SQL Co ...

  7. C#中如何实现将字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格

    思路:用空来替换首尾的空格,用一个空格替换中间的连续空格. 例如:string inputStr=” xx xx “; inputStr=inputStr.Trim(); inputStr=Regex ...

  8. 使用BeanUtils.copyProperties踩坑经历

    1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...

  9. BeanUtils.copyProperties() 用法

    BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处 ...

随机推荐

  1. Java基础(四)注释

    1.类注释 类注释必须放在import语句之后,类定义之前.eclipse中使用Shift + Alt + J快捷键添加类注释. 2.方法注释 每一个方法注释必须放在所描述的方法之前.除了通用标记之外 ...

  2. css简介以及css的添加方法

    什么是css? CSS是Cascading Style Sheets的简称,CSS是用来美化网页中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css的基本语法 1.选择 ...

  3. SpringBoot系列之@Value和@ConfigurationProperties

    继上一篇博客SpringBoot系列之YAML配置用法之后,再写一篇@Value.@ConfigurationProperties的对比博客 这两个主键都是可以获取配置文件属性的,不过是有比较大的区别 ...

  4. vue项目如何在node启动

    首先将vue项目通过命令npm run build 打包,然后创建start.js,代码如下: // const userApi = require('./api'); const fs = requ ...

  5. CentOS 7下MySQL 5.7安装

    5.7和之前版本的MySQL有一些不同,现把CentOS 7下MySQL 5.7安装.配置与应用完整过程记下来,或许对新手来说有用. 本文描述的安装是采用通用的二进制压缩包(linux – Gener ...

  6. Bash 通配符、正则表达式、扩展正则表达式

    BASH中的通配符(wildcard) *:任意长度的任意字符. ?:任意单个字符 []:匹配范围 [^]:排除匹配范围 [:alnum:]:所有字母和数字 [:alpha:]:所有字母 [:digi ...

  7. day 1 晚上 P2824 [HEOI2016/TJOI2016]排序 线段树

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #inclu ...

  8. egret Tiledmap编写障碍物的思路

    egret Tiledmap编写障碍物的思路 获取控制对象下一刻移动的坐标,将其转换成瓦片坐标,如果getTileGIDAt(根据瓦片坐标获取瓦片id)的值不为0,说明对象将要移动的位置有障碍物,不做 ...

  9. 前端Leader你应该知道的NPM包管理机制

    npm install 命令 首先总结下npm 安装一个模块包的常用命令. /* 模块依赖会写入 dependencies 节点 */ npm install moduleName npm insta ...

  10. maven的项目结构

    1.标准目录结构: src -main       –bin 脚本库       –java java源代码文件       –resources 资源库,会自动复制到classes目录里       ...