目前SpringBoot非常流行,大大简化了Spring整合Mybatis,SpringMVC的配置。但是另外的一件烦心事来了,那就是写接口时候,前后端都需要对String类型的字段做好去首尾空格处理,该项工作简单但是繁琐,虽不费心,但是劳神。在这里写了个注解,在接口进入controller前实现去除字符串去除首尾空格功能。
定义注解:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 描述:去除首尾空格的注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Trim {
}
使用Spring的拦截器
H
a
n
d
l
e
r
I
n
t
e
r
c
e
p
t
o
r
\color{#FF0000}{HandlerInterceptor }
HandlerInterceptor ,对进入controller的参数做通用化处理,但是在这里并不使用Spring自带的preHandle方法。
注解实现:
import java.lang.reflect.Field;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;
/**
* 描述: 去除首尾空格处理实现
*/
@Component
@Aspect
public class TrimInterceptor implements HandlerInterceptor {
/**
* 环绕处理
*
* @param proceedingJoinPoint
* 连接点
* @return 结果
* @throws Throwable
* 异常
*/
@Around(value = "@annotation(xxx.Trim)")//注解的全限定名称
public Object trimAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// 获取入参
Object[] objects = proceedingJoinPoint.getArgs();
if (Objects.nonNull(objects) && objects.length > 0) {
// 处理接口传参:去除首尾空格
for (int i = 0, len = objects.length; i < len; i++) {
objects[i] = trimExe(objects[i]);
}
}
// 继续执行controller层
return proceedingJoinPoint.proceed(objects);
}
/**
* 处理所有类型参数,包括基本数据类型与vo等对象,去除首尾空格
*
* @param object
* 对象
* @return 结果
* @throws IllegalAccessException
* 异常
*/
private static Object trimExe(Object object) throws IllegalAccessException {
// 对象为空,不做处理
if (Objects.isNull(object)) {
return object;
}
Class<? extends Object> clazz = object.getClass();
// 为非String包装类型,不做处理
if (clazz == Boolean.class || clazz == Short.class || 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 (Objects.isNull(fields) || fields.length == 0) {
return object;
}
for (Field field : fields) {
Class<?> filedType = field.getType();
// 只处理字符串类型
if (filedType != String.class) {
continue;
}
// 去除private权限,变为可更改
field.setAccessible(true);
if (Objects.nonNull(field.get(object))) {
// 在原有的对象上设置去除首尾空格的新值
field.set(object, String.valueOf(field.get(object)).trim());
}
}
return object;
}
/**
* 后置处理
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
}
/**
* 后处理回调方法
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
}
/**
* 预处理回调方法:在请求处理之前进行调用
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//不需要前置处理
return false;
}
}