背景
单元测试时,或入参可能为null时,代码中需要添加如下繁琐代码:
if( OjbectUtil.isNull (obj) ){
return R.FAIL("参数不能为空");
}
新增入参拦截校验注解@ParamNotNullCheck
- 使用范围:spring管理的方法上
- 原理:通过AOP拦截,逐个判断参数是否为null,为null时直接返回错误对象R
- 源码如下
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamNotNullCheck {
}
@Around("@annotation(paramNotNullCheck)")
public Object doAround(ProceedingJoinPoint pjp, ParamNotNullCheck paramNotNullCheck) throws Throwable {
MethodSignature signature = ((MethodSignature) pjp.getSignature());
//得到拦截的方法
Method method = signature.getMethod();
//获取方法参数名
String[] paramNames = signature.getParameterNames();
//获取参数值
Object[] paramValues = pjp.getArgs();
//获取方法参数类型
Class<?>[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < paramValues.length; i++) {
if (StrUtil.equals(parameterTypes[i].getName(), "java.lang.String") ) {
if (ObjectUtil.isNull(paramValues[i]) || StrUtil.isBlank(StrUtil.toString(paramValues[i]))){
//字符串,不能为 " " 或 null
return R.FAIL(StrUtil.format("参数{}不能为空", paramNames[i]));
}
}
if (ObjectUtil.isNull(paramValues[i])) {
return R.FAIL(StrUtil.format("参数{}不能为空", paramNames[i]));
}
}
return pjp.proceed();
}
@Configuration
@ConditionalOnWebApplication
public class CoreAutoConfiguration {
@Bean
public ParamCheckAspect paramCheckAspect() {
return new ParamCheckAspect();
}
}
- 返回对象为R
- 需要校验所有入数不能为null的(String亦不能为"")
该注解拦截案例相对简单,此处就不做代码说明,有问题可评论或私信博主。
使用示例
@Override
@ParamNotNullCheck
public R listOmsOrderPage(TzPage page) {
// 业务代码,此时如果 page = null,会直接返回 参数page不能为空
}