背景

下午三时许,笔者正戴着耳机听着歌开心的敲着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. 微软宣布加入 OpenJDK,看网上各派的热闹

    微软宣布加入 OpenJDK 项目(https://www.oschina.net/news/111036/microsoft-to-participate-in-openidk),这两天在微信公众号 ...

  2. 谁说程序员不懂浪漫?用Python每天自动给女朋友免费发短信

    前言 之前发过一篇文章,用 Python 制作的给父母天气预报提醒的小工具天气变冷了,给父母制作一个天气提醒小助手,这篇文章我同步到博客上之后,有读者在评论区留言,对于部分微信没有网页版接口,导致无法 ...

  3. Maven optional关键字透彻图解

    写在前面 本来想写一篇「如何自定义Spring Boot Starter」,但是为了更好理解 Starter 的一些设计理念和其中的关键点,所以提前将一些细节内容单独提取出来讲解说明 在 Maven ...

  4. 【Linux系列】Linux基础知识整理

    Linux操作系统在服务器领域广泛的使用到,作为一个后台开发工程师很有必要了解Linux相关的知识. 本篇日志是我学习Linux过程中的简单记录和总结.本着"理论够用,实践为主"的 ...

  5. 【MySQL】MySQL忘记密码或修改密码的方法

    MySQL修改新密码方法 记得原密码情况下,修改新密码:登录到数据库后,输入 set password for 用户名@localhost = '新密码';  来设置新的密码,别忘记分号哦.如图所示: ...

  6. (JavaScript) 时间转为几天前、几小时前、几分钟前

    // 时间戳转多少分钟之前 getDateDiff(dateTimeStamp) { // 时间字符串转时间戳 var timestamp = new Date(dateTimeStamp).getT ...

  7. Vue运用

    目录结构: ├── README.md 项目介绍 ├── index.html 入口页面 ├── build 构建脚本目录 │   ├── build-server.js 运行本地构建服务器,可以访问 ...

  8. 聊聊 Vue 中 provide/inject 的应用

    众所周知,在组件式开发中,最大的痛点就在于组件之间的通信.在 Vue 中,Vue 提供了各种各样的组件通信方式,从基础的 props/$emit 到用于兄弟组件通信的 EventBus,再到用于全局数 ...

  9. 【XSY2484】mex

    Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间[l,r] 设为1, 操作2是把给定区间[l,r] 设为0, 操作3把给定区间[l,r] 0,1反转. ...

  10. Kong02-KongA 介绍

    KongA 是 Kong 的一个 GUI 工具.GitHub 地址是 https://github.com/pantsel/konga . KongA 概述 KongA 带来的一个最大的便利就是可以很 ...