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

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

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

服務(wù)器之家 - 編程語言 - Java教程 - 詳解Spring AOP 實現(xiàn)“切面式”valid校驗

詳解Spring AOP 實現(xiàn)“切面式”valid校驗

2021-03-23 13:57CatalpaFlat Java教程

本篇文章主要介紹了詳解Spring AOP 實現(xiàn)“切面式”valid校驗,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

why:

為什么要用aop實現(xiàn)校驗

answer:

spring mvc 默認自帶的校驗機制 @valid + bindingresult, 但這種默認實現(xiàn)都得在controller方法的中去接收bindingresult,從而進行校驗.

eg:

?
1
2
3
4
5
6
7
if (result.haserrors()) {
 list<objecterror> allerrors = result.getallerrors();
 list<string> errorlists = new arraylist<>();
  for (objecterror objecterror : allerrors) {
    errorlists.add(objecterror.getdefaultmessage());
  }
 }

獲取errorlists。這樣實現(xiàn)的話,每個需要校驗的方法都得重復(fù)調(diào)用,即使封裝也是。

可能上面那么說還不能表明spring 的@valid + bindingresult實現(xiàn),我先舉個“栗子”。

1. 栗子(舊版本)

1.1 接口層(idal)

eg: 簡單的post請求,@requestbody接收請求數(shù)據(jù),@valid + bindingresult進行校驗

  1. httpmethid: post
  2. parameters:@requestbody接收請求數(shù)據(jù)
  3. valid:@valid +bindingresult
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@responsebody
 @postmapping("body")
 public responsevo bodypost(@requestbody @valid testvo body,bindingresult result){
  //校驗到錯誤
  if (result.haserrors()) {
   list<objecterror> allerrors = result.getallerrors();
   list<string> lists = new arraylist<>();
   for (objecterror objecterror : allerrors) {
     lists.add(objecterror.getdefaultmessage());
   }
   return new responsevo(httpstatus.bad_request.value(), "parameter empty", lists);
 }
   return new responsevo(httpstatus.ok.value(), "bodypost", null);
}

1.2 實體(vo)校驗內(nèi)容

@valid + bindingresult的校驗注解一大堆,網(wǎng)上一摸就有的!

?
1
2
3
4
5
6
7
8
9
10
public class testvo {
  @getter
  @setter
  @min(value = 0,message = "請求參數(shù)isstring不能小于0")
  private integer isint;
  @getter
  @setter
  @notblank(message = "請求參數(shù)isstring不能為空")
  private string isstring;
}

1.3 結(jié)果測試

詳解Spring AOP 實現(xiàn)“切面式”valid校驗

2. aop校驗(升級版)

可以看到若是多個像bodypost一樣都需要對body進行校驗的話,那么有一坨代碼就必須不斷復(fù)現(xiàn),即使改為父類可復(fù)用方法,也得去調(diào)用。所以左思右想還是覺得不優(yōu)雅。所以有了aop進行切面校驗。

2.1 接口層(idal)

是的!你沒看錯,上面那一坨代碼沒了,也不需要調(diào)用父類的的共用方法。就單單一個注解就完事了:@paramvalid

?
1
2
3
4
5
6
@paramvalid
@responsebody
@postmapping("body")
public responsevo bodypost(@requestbody @valid testvo body,bindingresult result){
  return new responsevo("bodypost", null);
}

2.2 自定義注解(annotation)

這個注解也是簡簡單單的用于方法的注解。

?
1
2
3
@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface paramvalid {}

2.3 重點!切面實現(xiàn)(aspect)

切面詳解:

@before: 使用注解方式@annotation(xx),凡是使用到所需切的注解(@paramvalid),都會調(diào)用該方法

joinpoint: 通過joinpoint獲取方法的參數(shù),以此獲取bindingresult所校驗到的內(nèi)容

遷移校驗封裝: 將原先那一坨校驗遷移到aspect中:validrequestparams

響應(yīng)校驗結(jié)果:

  1. 通過requestcontextholder獲取response
  2. 獲取響應(yīng)outputstream
  3. 將bindingresult封裝響應(yīng)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@aspect
@component
public class paramvalidaspect {
 
  private static final logger log = loggerfactory.getlogger(paramvalidaspect.class);
 
  @before("@annotation(paramvalid)")
  public void paramvalid(joinpoint point, paramvalid paramvalid) {
    object[] paramobj = point.getargs();
    if (paramobj.length > 0) {
      if (paramobj[1] instanceof bindingresult) {
        bindingresult result = (bindingresult) paramobj[1];
        responsevo errormap = this.validrequestparams(result);
        if (errormap != null) {
          servletrequestattributes res = (servletrequestattributes) requestcontextholder.getrequestattributes();
          httpservletresponse response = res.getresponse();
          response.setcharacterencoding("utf-8");
          response.setcontenttype(mediatype.application_json_utf8_value);
          response.setstatus(httpstatus.bad_request.value());
 
          outputstream output = null;
          try {
            output = response.getoutputstream();
            errormap.setcode(null);
            string error = new gson().tojson(errormap);
            log.info("aop 檢測到參數(shù)不規(guī)范" + error);
            output.write(error.getbytes("utf-8"));
          } catch (ioexception e) {
            log.error(e.getmessage());
          } finally {
            try {
              if (output != null) {
                output.close();
              }
            } catch (ioexception e) {
              log.error(e.getmessage());
            }
          }
        }
      }
    }
  }
 
  /**
   * 校驗
   */
  private responsevo validrequestparams(bindingresult result) {
    if (result.haserrors()) {
      list<objecterror> allerrors = result.getallerrors();
      list<string> lists = new arraylist<>();
      for (objecterror objecterror : allerrors) {
        lists.add(objecterror.getdefaultmessage());
      }
      return new responsevo(httpstatus.bad_request.value(), "parameter empty", lists);
    }
    return null;
  }
}

2.4 測試結(jié)果

 詳解Spring AOP 實現(xiàn)“切面式”valid校驗

看了上面兩種結(jié)果,就可以對比出使用spring aop 配合@valid + bindingresult進行校驗的優(yōu)點:

  1. 去除代碼冗余
  2. aop異步處理
  3. 優(yōu)化代碼實現(xiàn)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://juejin.im/post/5a5e1159518825732b19d8ce

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99热在线精品播放 | 国产一级毛片国语版 | 水岛津实在线 | 国内自拍网红在综合图区 | 视频网站入口在线看 | 四虎精品免费视频 | 好深快点再快点好爽视频 | 日日爽 | 99r8这里精品热视频免费看 | 日韩美一区二区三区 | 日韩一级片在线观看 | 从后面撕开老师的丝袜动态图 | 15同性同志18| 亚洲第一国产 | 农夫色综合| 免费在线观看成年人视频 | 国产精品久久久 | 222aaa精品影院| 韩国美女豪爽一级毛片 | 日韩精品免费一区二区三区 | 香蕉精品国产高清自在自线 | 国自产精品手机在线视频 | 蝴蝶传媒3o45| 91porny新九色在线 | 大片毛片女女女女女女女 | 四虎国产精品免费久久久 | 福利视频免费 | 国产亚洲精品久久yy5099 | 成人在线免费播放 | 国产成人yy精品1024在线 | 国产色网址 | 亚洲狠狠婷婷综合久久蜜桃 | 精品在线免费观看 | 法国女佣系列在线播放 | 亚洲第一综合天堂另类专 | 奇米9999| 欧美yyy| 欧美精品一区视频 | 国产好痛疼轻点好爽的视频 | 久久亚洲精品AV成人无码 | 蜜桃视频在线观看官网 |