最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用自定義注解+springAop實現(xiàn)參數(shù)非空校驗方式

 更新時間:2021年09月28日 12:12:35   作者:DRNB666  
這篇文章主要介紹了使用自定義注解+springAop實現(xiàn)參數(shù)非空校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

自定義注解+springAop參數(shù)非空校驗

自定義注解,來對對應(yīng)的方法進(jìn)行入?yún)⑿r灒瑸榭辗祷貐?shù)錯誤

新建注解類@interface ParamsVerify

@Target(ElementType.METHOD)//枚舉,表示注解可能出現(xiàn)在的地方
@Retention(RetentionPolicy.RUNTIME)//運行時保留注解
@Documented//生成api文檔時會看到此注解,可加可不加
public @Interface ParamsVerify(){
//注解類修飾符必須是public 如果不寫會默認(rèn)public    
   String[] params() default "";//傳入方法的參數(shù)
}

利用springAop來實現(xiàn)切面

利用springAop,我們可以把除業(yè)務(wù)核心代碼以外的,需要重復(fù)進(jìn)行的操作來統(tǒng)一處理,例如打印日志,參數(shù)校驗等等,以切面的方式來進(jìn)行,一個切面,由切點、通知(增強(qiáng))來組成

增強(qiáng)就是對Aop管理的代碼來通過動態(tài)代理來添加額外的邏輯(代碼),動態(tài)代理有兩種實現(xiàn)方式,一種是通過jdk,一種是通過cglib,springboot中默認(rèn)是使用cglib來進(jìn)行動態(tài)代理的;而切點(ponitCut),是多個連接點組成的一個切點,通常通過表達(dá)式來指向程序中一個定義的位置,來告知springAop啟動的范圍

//這個切點定義為使用該注解的方法都可以執(zhí)行該切面類里的通知
@Pointcut("@annotation(com.xy.utlis.annotations.TestA)")

新建一個切面類

通知方法執(zhí)行順序

環(huán)繞–前置—后置

@Aspect//聲明該類是一個切面類
@Component//聲明該類交由spring管理
public class testAImpl {
    
    /** 定義切點,使用該TestA注解的方法 */
    @Pointcut("@annotation(com.xy.utlis.annotations.TestA)")
    public void addAdvice(){
    }
   
    @Aroud("addAdvice")//環(huán)繞通知  另外還有@Before @After
    public Object test(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("環(huán)繞方法開始執(zhí)行....");
        //獲取所有參數(shù)名
        String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
        //獲取所有參數(shù)值
        Object[] args = joinPoint.getArgs();
        //獲取當(dāng)前注解下的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        //根據(jù)當(dāng)前方法獲取注解
        TestA annotation = signature.getMethod().getAnnotation(TestA.class);
        String[] names = annotation.params();//獲得注解參數(shù)
        Map<String, Object> params = params(joinPoint);
        for (String name : names) {
            Object o = params.get(name);
            if(null==o||"".equals(o)){
                System.err.println(MessageFormat.format("參數(shù)名為{0}的值為null",name));
                return false;
            }
        }
        System.out.println("環(huán)繞方法結(jié)束執(zhí)行....");
        return joinPoint.proceed();//繼續(xù)正常執(zhí)行方法
    }
}

寫一個接口來測試是否成功

@PostMapping("test")
@TestA(params={"name","age","sex"})//表明這三個參數(shù)是必填的
public void test(String name,String age,String sex){
 System.out.println("ok");
}

發(fā)送post請求,只攜帶name

在這里插入圖片描述

檢測到參數(shù)為null,打印錯誤信息

在這里插入圖片描述

這里可以自定義返回異常值或者其他處理了

帶上完整參數(shù)請求接口

在這里插入圖片描述

成功放行

在這里插入圖片描述

使用注解統(tǒng)一校驗參數(shù)非空

可修改做工具類

代碼:

1. 待校驗類

public class User { 
    @NonNull(content = "姓名不能為空", minLen = 2, maxLen = 100)
    private String name; 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

2. 注解類

@Documented
@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface NonNull { 
    String name() default ""; 
    String content() default ""; 
    int maxLen() default 50; 
    int minLen() default 1;
}

3. 校驗

    public void test() {
        User user = new User();
        user.setName("老王");
        try {
            valid(user);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
 
    private <T> void valid(T user) throws IllegalAccessException, InvocationTargetException {
        Class<?> clazz = user.getClass();
        Field[] declaredFields = clazz.getDeclaredFields();
        Method[] methods = clazz.getMethods();
        for (Field field : declaredFields) {
            validParams(user, methods, field);
        }
        System.out.println("==========參數(shù)校驗通過=========");
    }
 
    private <T> void validParams(T user, Method[] methods, Field field) throws IllegalAccessException, InvocationTargetException {
        NonNull annotation = field.getAnnotation(NonNull.class);
        String fieldName;
        if (StringUtils.isNotBlank(annotation.name())) {
            fieldName = annotation.name();
        } else {
            fieldName = field.getName();
        }
        for (Method method : methods) {
            if (("get" + fieldName).toLowerCase().equals(method.getName().toLowerCase())) {
                Object getMethodResult = method.invoke(user, null);
                if (getMethodResult == null) {
                    System.out.println("==========非Null校驗失敗=========");
                    throw new IllegalArgumentException("[" + annotation.content() + "]為null");
                }
                if (getMethodResult instanceof String) {
                    if (StringUtils.isBlank(String.valueOf(getMethodResult))) {
                        System.out.println("==========非空校驗失敗=========");
                        throw new IllegalArgumentException("[" + annotation.content() + "]為空");
                    }
                    System.out.println(fieldName + "長度:" + String.valueOf(getMethodResult).length());
                    if (String.valueOf(getMethodResult).length() > annotation.maxLen()) {
                        System.out.println("==========長度超出指定范圍=========");
                        throw new IllegalArgumentException("[" + fieldName + "]長度超出");
                    }
                    if (String.valueOf(getMethodResult).length() < annotation.minLen()) {
                        System.out.println("==========長度小于指定范圍=========");
                        throw new IllegalArgumentException("[" + fieldName + "]長度不夠");
                    }
                }
            }
        }
    }

結(jié)果參考:

name長度:2

==========參數(shù)校驗通過=========

name長度:2

==========長度小于指定范圍=========

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編程實現(xiàn)逆波蘭表達(dá)式代碼示例

    Java編程實現(xiàn)逆波蘭表達(dá)式代碼示例

    本文主要對Java算法逆波蘭表達(dá)式的相關(guān)內(nèi)容作了介紹,涉及逆波蘭表達(dá)式的定義已經(jīng)在Java中的實現(xiàn),具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java新手環(huán)境搭建 Tomcat安裝配置教程

    Java新手環(huán)境搭建 Tomcat安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Java新手環(huán)境搭建的相關(guān)資料,Tomcat安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring中的BeanFactory工廠詳細(xì)解析

    Spring中的BeanFactory工廠詳細(xì)解析

    這篇文章主要介紹了Spring中的BeanFactory工廠詳細(xì)解析,Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用,需要的朋友可以參考下
    2023-12-12
  • SpringBoot四種讀取properties文件的方式(小結(jié))

    SpringBoot四種讀取properties文件的方式(小結(jié))

    這篇文章主要介紹了SpringBoot四種讀取properties文件的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • java工具類實現(xiàn)文件壓縮zip以及解壓縮功能

    java工具類實現(xiàn)文件壓縮zip以及解壓縮功能

    這篇文章主要給大家介紹了關(guān)于java工具類實現(xiàn)文件壓縮zip以及解壓縮功能的相關(guān)資料,文中主要使用使用的是hutool工具類,Hutool是一個Java工具類庫,由國內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實用的工具類和工具方法,需要的朋友可以參考下
    2024-02-02
  • Java實現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信

    Java實現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信

    這篇文章主要為大家詳細(xì)介紹了Java語言如何利用圖片或視頻實現(xiàn)生成GIF并發(fā)送微信的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-11-11
  • Spring、Spring?Boot、Spring?Cloud?的區(qū)別與聯(lián)系分析

    Spring、Spring?Boot、Spring?Cloud?的區(qū)別與聯(lián)系分析

    Spring、SpringBoot和SpringCloud是Java開發(fā)中常用的框架,分別針對企業(yè)級應(yīng)用開發(fā)、快速開發(fā)和分布式系統(tǒng),本文介紹Spring、Spring?Boot、Spring?Cloud?的區(qū)別與聯(lián)系,感興趣的朋友一起看看吧
    2025-03-03
  • SpringBoot項目中使用Swagger2及注解解釋的詳細(xì)教程

    SpringBoot項目中使用Swagger2及注解解釋的詳細(xì)教程

    Swagger2是一個開源項目,用于為RESTful Web服務(wù)生成REST API文檔,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目中使用Swagger2及注解解釋的詳細(xì)教程,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • SpringBoot項目中使用redis緩存的方法步驟

    SpringBoot項目中使用redis緩存的方法步驟

    本篇文章主要介紹了SpringBoot項目中使用redis緩存的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 使用IntelliJ IDEA 進(jìn)行代碼對比的方法(兩種方法)

    使用IntelliJ IDEA 進(jìn)行代碼對比的方法(兩種方法)

    這篇文章給大家?guī)砹藘煞NIntelliJ IDEA 進(jìn)行代碼對比的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

翁源县| 澎湖县| 澄城县| 额敏县| 玉溪市| 那曲县| 石狮市| 尉氏县| 文化| 宜宾市| 临夏县| 五寨县| 五莲县| 青冈县| 五大连池市| 锦屏县| 彭泽县| 定州市| 仙居县| 宁乡县| 鄂托克前旗| 吉林市| 六安市| 东乌| 临汾市| 凤翔县| 政和县| 南昌县| 邮箱| 晋中市| 抚州市| 沙田区| 东丽区| 雅江县| 孟连| 定远县| 个旧市| 徐州市| 和田县| 巴彦县| 鹤山市|