1定义一个在方法上作用的注解
@Retention(RetentionPolicy.RUNTIME) // 表示注解在运行时依然存在
@Target(ElementType.METHOD)
@Documented
public @interface noNull {
public String str() default "";
}
2定义一个拦截类,拦截被注解的方法,并验证注解中指定的方法是否为空
public class NoNullInterceptor extends HandlerInterceptorAdapter{
//在请求处理之前进行调用(Controller方法调用之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//如果不是映射到方法直接通过
if (!(o instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) o;
Method method = handlerMethod.getMethod();
if (method.getAnnotation(noNull.class) != null) {
noNull noNullAnnotation=method.getAnnotation(noNull.class);
String Str = noNullAnnotation.str();
//从httpServletRequest获取注解上指定的参数
Object obj = httpServletRequest.getParameter(Str);
if(null != obj){
return true;
}else{
httpServletResponse.getWriter().write(JSON.toJSONString(new Result("false","参数缺失")));
return false;
}
}else{
return true;
}
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
3将上步定义的拦截类加入到拦截链
@Configuration
public class interceptorConfig extends WebMvcConfigurerAdapter{
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new NoNullInterceptor())
.addPathPatterns("/**");
//非空字段拦截
super.addInterceptors(registry);
}
}
4将注解和需要验证非空的参数在需要做非空check的方法声明
@noNull(str = "userName")
public Result sysLogin (
@RequestParam(value="userName", required=false) String userName,
@RequestParam(value="passWord", required=false) String passWord
) {
return Service.sysLogin(userName, passWord);
}
5实现效果