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技術文章,期待您的關注!

原創不易,轉載請註明出處,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章