12.01 測試老是給我提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
@Aspect
public 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")
@TrimValue
public ResResult updateAppMsg(AppVo appVo) {
\t\t...
}

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


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

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


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


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


添加trim模板

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


選擇trim模板

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

最後,自動生成trim


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

這樣就搞定啦,不過這樣只能針對controller參數是對象的參數,如果是基本的string類型,就無能為力啦。



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


分享到:


相關文章: