原文鏈接:https://blog.csdn.net/weixin_37535975/article/details/94443617
1.自定義個注解類
@Target({ElementType.PARAMETER})//參數級別
@Retention(RetentionPolicy.RUNTIME) //注解保留到運行階段
public @interface ParamsNotNull {
}
@Target
通俗講,定義放在什么位置,這個是放在參數中
此外還有
1.ElementType.CONSTRUCTOR:用於描述構造器
2.ElementType.FIELD:用於描述域(類的成員變量)
3.ElementType.LOCAL_VARIABLE:用於描述局部變量(方法內部變量)
4.ElementType.METHOD:用於描述方法
5.ElementType.PACKAGE:用於描述包
6.ElementType.PARAMETER:用於描述參數
7.ElementType.TYPE:用於描述類、接口(包括注解類型) 或enum聲明
@Retention 定義了該Annotation被保留的時間長短,有些只在源碼中保留,有時需要編譯成的class中保留,有些需要程序運行時候保留。即描述注解的生命周期
此時針對的在運行中,此外還有
1.RetentionPoicy.SOURCE:在源文件中有效(即源文件保留)
2.RetentionPoicy.CLASS:在class文件中有效(即class保留)
2.自定義攔截器,具體判斷請求來的參數
/** * @Description 參數檢查注解攔截器 */ public class CheckParamsInterceptor extends HandlerInterceptorAdapter { private static Logger logger = LoggerFactory.getLogger(CheckParamsInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { logger.warn("UnSupport handler"); return true; } List<String> list = getParamsName((HandlerMethod) handler); for (String s : list) { String parameter = request.getParameter(s); if (StringUtils.isEmpty(parameter)){ JSONObject jsonObject = new JSONObject(); //這個地方是定義缺少參數或者參數為空的時候返回的數據 jsonObject.put("status", 203); jsonObject.put("msg", "缺少必要的"+s+"值"); response.setHeader("Content-type", "application/json;charset=UTF-8"); response.setHeader("Access-Control-Allow-Origin", "*");//跨域 response.getWriter().write(jsonObject.toJSONString()); return false; } } return true; }
/** * 獲取使用了該注解的參數名稱 */ private List getParamsName(HandlerMethod handlerMethod) { 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; }
3.添加校驗的攔截器config
@Configuration public class WebMvcConfig implements WebMvcConfigurer { CheckParamsInterceptor checkSourceInterceptor = new CheckParamsInterceptor(); //增加校驗攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 這個地方可以定義攔截器的具體的路徑 registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**"); } }
4.寫一個測試類測試一下效果
@RestController @RequestMapping("/test") public class TestController { @RequestMapping("/test") //注解不要加,在參數類型前邊加上 public String test(@ParamsNotNull String userId){ return "ok"; } }

這個是當參數為空的時候的校驗
這個是沒有這個參數屬性的時候,其實效果是一樣的
這樣以后再判斷參數是不是為空的時候,直接加個注解就可以了~!就不用再單獨判斷參數為空啦!
原文鏈接:https://blog.csdn.net/weixin_37535975/article/details/94443617
