开发中经常会遇见数据没去除空格导致数据存在问题。这是很久之前找到的注解去除空格的代码,做个记录。
话不多说,直接上干货。
1.定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Trim {
/**
* 不需要剔除空格的参数名集合
*/
String[] excludes() default {};
}
2.定义切面,取接收到的值做处理
/**
* 切面:对使用@Trim自定义注解的接口剔除其中的参数值的前后空格
*/
@Slf4j
@Aspect
@Component
public class TrimAspect {
@Pointcut("@annotation(com.ruoyi.common.annotation.Trim)")
public void trim() {
// this is aop pointcut
}
@Around("trim()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Trim trim = signature.getMethod().getAnnotation(Trim.class);
if (null == trim) {
return proceedingJoinPoint.proceed();
}
Object[] args = proceedingJoinPoint.getArgs();
if (null == args || args.length == 0) {
return proceedingJoinPoint.proceed(args);
}
List<String> excludeParams = Arrays.asList(trim.excludes());
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse) {
continue;
}
if (canBeParsed(JSON.toJSONString(args[i]))) {
Class<?> type = args[i].getClass();
Object result = jsonLoop(JSON.parseObject(JSON.toJSONString(args[i])), excludeParams);
args[i] = JSON.parseObject(JSON.toJSONString(result), type);
}
}
return proceedingJoinPoint.proceed(args);
}
/**
* JSON 循环解析
*/
private Object jsonLoop(Object object, List<String> excludeParams) {
if (null == object) {
return null;
}
if (object instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) object;
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
parse(excludeParams, jsonObject, entry.getKey(), entry.getValue());
}
}
if (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) object;
for (Object element : jsonArray) {
jsonLoop(element, excludeParams);
}
}
return object;
}
/**
* json解析
*/
private void parse(List<String> excludeParams, JSONObject jsonObject, String key, Object value) {
if (excludeParams.contains(key) || null == value) {
return;
}
if (value instanceof String) {
if (StringUtils.isBlank(value.toString())) {
jsonObject.put(key, null);
} else {
jsonObject.put(key, value.toString().trim());
}
} else if (value instanceof JSONArray || value instanceof JSONObject) {
jsonLoop(value, excludeParams);
} else {
log.debug("nothing to do");
}
}
/**
* 是否能够被fastJSON 解析
*
* @param str 被解析的字符串
*/
private boolean canBeParsed(String str) {
try {
JSON.parseObject(str);
} catch (Exception e) {
return false;
}
return true;
}
}
3.注解使用
@ApiOperation("测试@Trim是否生效")
@PostMapping("/trim")
@Trim
public void trim(@RequestBody Test test) {
if (StringUtils.isNotNull(test)) {
System.out.println(test);
}
}
4.展示效果