效果演示:
1.创建自定义注解类
@Target(ElementType.PARAMETER)// 表示该注解是加载参数上的; @Target: 定义放在什么位置,这个是放在参数中
@Retention(RetentionPolicy.RUNTIME)// 注解保留到运行阶段; @Retention: 定义了该Annotation被保留的时间长短,有些只在源码中保留,有时需要编译成的class中保留,有些需要程序运行时候保留。即描述注解的生命周期
public @interface ParamsNotNull {
}
2.自定义拦截器
/**
* @description: 参数检查注解拦截器
*/
@Component
public class CheckParamsInterceptor extends HandlerInterceptorAdapter {
public static final String LOGGER_NAME = "EXCEPTION";
private final static Logger logger = LoggerFactory.getLogger(LOGGER_NAME);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
logger.info("UnSupport handler");
return true;
}
List<String> list = getParamsName((HandlerMethod) handler);
// 线程安全的字符串拼接
StringBuffer stringBuffer = new StringBuffer();
// 检查参数是否为空
for (String s : list) {
String parameter = request.getParameter(s);
//这个地方是定义缺少参数或者参数为空的时候返回的数据
if (StringUtils.isEmpty(parameter)){
// 参数为空记录进字符串,并进行循环拼接
stringBuffer.append("缺少必要参数"+s+";");
}
}
if (!StringUtils.isEmpty(stringBuffer)) {
// 当stringBuffer为空的时候,表示没有参数为空
JointResult jointResult = new JointResult();
jointResult.setSuccess(false);
jointResult.setCode(2103);
jointResult.setMessage(stringBuffer.toString());
response.setHeader("Content-type", "application/json;charset=UTF-8");
//跨域
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write(JSONObject.toJSONString(jointResult));
return false;
} else {
return true;
}
}
/**
* 获取使用了该注解的参数名称
*/
private List getParamsName(HandlerMethod handlerMethod) {
// 利用java反射获取参数
Parameter[] parameters = handlerMethod.getMethod().getParameters();
List<String> list = new ArrayList<>();
for (Parameter parameter : parameters) {
//判断这个参数是否被加入了 ParamsNotNull. 的注解
//.isAnnotationPresent() 判断是否加了这个注释
if(parameter.isAnnotationPresent(ParamsNotNull.class)){
list.add(parameter.getName());
}
}
return list;
}
}
起重日志使用的是@Slf4j+logback,自定义了exception记录日志。该拦截器验证参数会对所有参数进行验证,若存在多个参数为空,会统一返回。如:
3.配置拦截器,增加校验拦截器
/**
* @description: 拦截器
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private CheckParamsInterceptor checkSourceInterceptor;
/**
* 增加校验拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 这个地方可以定义拦截器的具体的路径,启动项目时就会执行此方法
registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**");
}
}