需求:在进入到相应Controller控制器前,需要先校验参数是否符合规范要求,如是否为空等等。
有人说,可以使用@PathVariable里面的required属性控制,然而该属性只是代表参数是否必填,并不能校验参数的值是否满足要求。
解决
考虑到项目可能多处需要做此判断,所以我采用注解和切面的方式来解决此问题。
首先定义一个注解,用作标识,在参数的值需要做非空判断的地方添加该注解,定义一个切面来对添加了注解的地方进行校验。
添加注解
ParamNotNullCheck.java
内容:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamNotNullCheck {}
添加切面
切面的逻辑可参考下面图片
public class ParasCheckAspect {
@Around(@annotation(paraaNotNullCheck)*)
public Object doAround (ProceedingJoinPoint joinPoint, ParamNotNullCheck paramNotNullCheck) throws Throwable {
MethodSignature signature=(MethodSignature) joinPoint.getSignature();
//获取拦截的方法
Method method = signature. getMethod();
//获取方法的参数名
String paranNames = signature. getParameterNames();
//获取参数值
Object paramValues = joinPoint.getArgs();
//获取方法参数类型
Class<?>[] parameterTypes =method .getParameterTypes();
for (int i=0;i < paramValues.length; i++){
Object paramValue =paramValues[i];
if(StrUtil.equals(parameterTypes[i].getName(),"java.lang.String") {
if (ObjectUtil.isNull(paramValue) II StrUtil.isBlank(paramValue)){
//字符串,不能为空串(""、" " 等等)和null
return ResultEntity.fail(StrUtil.format( “参数数{}不能为空",paramNames[i]));}}
if (ObjectUtil.isNull(paramValue)){
return ResultEntity.fail(StrUtil.format("参数{}不能为空",paramNames[i]));}}
return joinPoint.proceed();
}}
最后在需要做非空判断的地方加上@ParamNotNullCheck注解即可。如下所示: