自定义Controller接口参数的值不能为空的校验

需求:在进入到相应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注解即可。如下所示:自定义Controller接口参数的值不能为空的校验_第1张图片

 

你可能感兴趣的:(java,后端框架,java)