背景

下午三时许,笔者正戴着耳机听着歌开心的敲着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. PHP比较IP大小

    function cmpLoginIP($a, $b) { return bindec(decbin(ip2long($a['loginIp']))) > bindec(decbin(ip2lo ...

  2. .NET webAPI中集成swagger

    最近做的项目使用winform三层+webapi,对于webAPI路由文档管理一直觉得单独做一些管理比较麻烦,并且测试的时候项目内的代码测试运行起来也比较麻烦,所以在网上开始检索相关办法,发现热度比较 ...

  3. 第二篇 Flask的Response三剑客及两个小儿子

    一.Response三剑客 (一)Flask中的HTTPResponse @app.route("/") #app中的route装饰器 def index(): #视图函数 ret ...

  4. Splash的使用

    Splash Lua脚本http://localhost:8050 入口及返回值 function main(splash, args) splash:go("http://www.baid ...

  5. 【XSY2488】【HDU5818】Joint Stacks

    这题合并栈让我们想到了左偏树. 我们可以维护val值为时间,dis值为size的左偏树,定义两个根root1和root2,表示两个栈的栈顶,建大根的左偏树. 接下来的插入,删除,两个栈合并都是左偏树的 ...

  6. C++学习笔记14_C#调用dll

    1. 首先C++创建dll项目,各种调第三方库,把这些东西都弄好后,整一个导出接口,例如: extern "C" __declspec(dllexport) int Add(int ...

  7. 原生JS实现单向链表

    1.前言 用JS实现一个简单的单向链表,并完成相关的功能 2.功能说明 push(value):从链表尾部添加一个新的节点 insertAfer(value,item):向链表中的item节点之后插入 ...

  8. ElasticSearch(三):通分词器(Analyzer)进行分词(Analysis)

    ElasticSearch(三):通过分词器(Analyzer)进行分词(Analysis) 学习课程链接<Elasticsearch核心技术与实战> Analysis与Analyzer ...

  9. linux No module named yum错误的解决办法

    linux No module named yum错误的解决办法 肯定是yum的版本与当前python的版本不一致造成的 <pre>所以修改yum的配置,修改文件: vim /usr/bi ...

  10. Flink入门(一)——Apache Flink介绍

    Apache Flink是什么? ​ 在当代数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如何进行有效的处理,成为当下大多数公司所面临的问题.随着雅虎对hadoop的 ...