需求:在进入到相应Controller控制器前,需要先校验参数是否符合规范要求,如是否为空等等。
有人说,可以使用@PathVariable里面的required属性控制,然而该属性只是代表参数是否必填,并不能校验参数的值是否满足要求。
解决
考虑到项目可能多处需要做此判断,所以我采用注解和切面的方式来解决此问题。
首先定义一个注解,用作标识,在参数的值需要做非空判断的地方添加该注解,定义一个切面来对添加了注解的地方进行校验。
添加注解
ParamNotNullCheck.java
内容:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamNotNullCheck {}
添加切面
切面的逻辑可参考下面代码
@Aspect
@Component
public class ParamNotNullCheckAspect {
@Around("@annotation(com.dtranx.tools.corpora.business.annotations.ParamNotNullCheck)")
public Object doAround (ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature=(MethodSignature) joinPoint.getSignature();
//获取拦截的方法
Method method = signature. getMethod();
//获取方法的参数名
String[] paramNames = 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) || StrUtil.isBlank((String) paramValue)){
//字符串,不能为空串(""、" " 等等)和null
return ResponseResult.failure(StrUtil.format( "参数数{}不能为空",paramNames[i]), 10021);}}
if (ObjectUtil.isNull(paramValue)){
return ResponseResult.failure(StrUtil.format("参数{}不能为空",paramNames[i]), 10021);}}
return joinPoint.proceed();
}
}
最后在需要做非空判断的地方加上@ParamNotNullCheck注解即可。如下所示: