springboot自定義注解 判斷參數是否傳遞或者為空


原文鏈接: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM