測試老是給我提bug,沒有做trim處理

很多後端介面開發,都懶得做傳參的去空格處理,我也一樣,這不被測試逼的沒辦法了,怎麼能高效的對介面傳參做trim處理呢?

一、利用攔截器與反射處理

com包下先定義一個註解

@Retention(RetentionPolicy。RUNTIME)@Target(ElementType。METHOD)public @interface TrimValue {}

再定義一個攔截器

import org。apache。commons。lang3。ArrayUtils;import org。aspectj。lang。ProceedingJoinPoint;import org。aspectj。lang。annotation。Around;import org。aspectj。lang。annotation。Aspect;import org。springframework。stereotype。Component;import org。springframework。web。servlet。HandlerInterceptor;import org。springframework。web。servlet。ModelAndView;import javax。servlet。http。HttpServletRequest;import javax。servlet。http。HttpServletResponse;import java。lang。reflect。Field;import java。util。Objects;@Component@Aspectpublic class TrimInterceptor implements HandlerInterceptor { @Around(“@annotation(com。TrimValue)”) public Object around(ProceedingJoinPoint pjp) throws Throwable { Object retObj; try { Object[] args = pjp。getArgs(); if (ArrayUtils。isNotEmpty(args)) { // 處理介面傳參 for (int i = 0; i < args。length; i++) { args[i] = trim(args[i]); } } retObj = pjp。proceed(args); } catch (Exception e) { throw e; } return retObj; } // 處理所有型別引數,包括基本資料型別與vo等物件 public static Object trim(Object object) throws IllegalAccessException { if (Objects。isNull(object)) { return null; } Class<? extends Object> clazz = object。getClass(); if (clazz == Integer。class || clazz == Long。class || clazz == Float。class || clazz == Double。class) { return object; } if (clazz == String。class) { return object。toString()。trim(); } //防止欄位為private時,無法修改欄位值的情況 Field[] fields = clazz。getDeclaredFields(); if (ArrayUtils。isNotEmpty(fields)) { for (Field field : fields) { Class<?> filedType = field。getType(); // 只處理字串型別 if (filedType == String。class) { //去除許可權 field。setAccessible(true); if (Objects。nonNull(field。get(object))) { field。set(object, field。get(object)。toString()。trim()); } } } } return object; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { }}

最後在controller介面使用即可

@ResponseBody@RequestMapping(“updateAppMsg”)@TrimValuepublic ResResult updateAppMsg(AppVo appVo) { 。。。}

這樣就能自動對appVo裡的字串引數做trim處理啦

二、利用idea的程式碼自動生成模板

如果大家嫌麻煩,也可以手動透過設定setter模板,自動加上trim

測試老是給我提bug,沒有做trim處理

測試老是給我提bug,沒有做trim處理

新增trim模板

測試老是給我提bug,沒有做trim處理

選擇trim模板

測試老是給我提bug,沒有做trim處理

最後,自動生成trim

測試老是給我提bug,沒有做trim處理

這樣就搞定啦,不過這樣只能針對controller引數是物件的引數,如果是基本的string型別,就無能為力啦。

這兩種方案,你喜歡哪一個呢?或者有其他好的方案麼,請留言?