一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 使用自定義注解+springAop實現(xiàn)參數(shù)非空校驗方式

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

2022-01-21 01:06DRNB666 Java教程

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

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

自定義注解,來對對應(yīng)的方法進行入?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ù)進行的操作來統(tǒng)一處理,例如打印日志,參數(shù)校驗等等,以切面的方式來進行,一個切面,由切點、通知(增強)來組成

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

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

新建一個切面類

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

環(huán)繞C前置―后置

@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

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

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

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

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

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

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

成功放行

使用自定義注解+springAop實現(xiàn)參數(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)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/DRNB666/article/details/110454228

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 亚洲精品久久久打桩机 | 国产成人精品.一二区 | 美女的让男人桶爽30分钟的 | 国产精品久久久久久久久99热 | 亚洲电影第1页 | porno中国xxxxx| japan在线观看| 调教校花浣肠开菊 | 欧美不卡一区二区三区免 | 欧美a欧美1级 | 四虎影视在线永久免费观看 | 国产成人精品免费久久久久 | 红楼梦黄色小说 | 韩国悲惨事件30无删减在线 | 国产成人亚洲精品一区二区在线看 | 共妻高h| 超级乱淫 不详 | 九九九九九九 | 天堂网在线网站成人午夜网站 | 久久99国产综合精品AV蜜桃 | 四虎永久免费地址ww417 | 午夜亚洲精品久久久久久 | 精品亚洲综合在线第一区 | yy6080久久国产伦理 | 国产精品久久久精品日日 | 国产精品免费综合一区视频 | 成人影院观看 | 国产大片51精品免费观看 | 91视频国产精品 | 给我一个黄色网址 | 草莓绿巨人香蕉茄子芭乐 | 欧美同性gayvidoes | 亚洲精品国产自在现线最新 | 国产高清在线精品一区二区 | 韩国三级做爰 | 欧美一区二区三区精品国产 | 大学生宿舍飞机 free | 国产亚洲成归v人片在线观看 | 国产第一页在线视频 | 久久视频在线视频观看天天看视频 | 男人午夜免费视频 |