在开发过程中,经常会遇到,当条件产生有前后空格时 导致查询为空,或发生异常,如果对于每个参数都在controller层后者实现层来去除空格的话,会造成代码的重复,以及在工作中很浪费时间 这个时候可以使用注解来去除前端传递参数的空格,这里只做了前后去除空格,没有做去除中间的空格
第一步 创建注解类
/**
* 描述:去除首尾空格的注解
* @author Administrator
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited //允许子类继承父类的注解。 (子类中可以获取并使用父类注解)
public @interface Trim {
}
第二步 定义切面具体实现
/**
* 描述: 去除首尾空格处理实现
*/
@Component
@Aspect
public class TrimInterceptor implements HandlerInterceptor {
/**
* 环绕处理
* 连接点
* 注解的全限定名称
* @return 结果
* @throws Throwable 异常
*/
@Pointcut(value = "@annotation(com.manager.west.annotation.Trim)")
public void trimAround() throws Throwable {
}
@Before("trimAround()")
public Object before(JoinPoint proceedingJoinPoint) throws IllegalAccessException {
System.out.println("trimAround方法执行之前");
// 获取入参
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]);
}
}
return 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;
}
}
第三步 具体使用
@GetMapping("/list")
@Trim
@ApiOperation("删除信息管理列表")
public TableDataInfo list(WestRequestLeaveVo westRequestLeave) {
startPage();
return getDataTable(volunteerService.listDel(westRequestLeave));
}