欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法

 更新時間:2019年09月24日 10:29:12   作者:雙斜杠少年  
這篇文章主要介紹了springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE

項目結(jié)構(gòu)

  • test-rest (前端消費著,controller 層,springboot+maven項目)
  • test-api (dubbo服務(wù) 的 api ,只記錄 service 接口和 model ,maven 項目)
  • test-provider(dubbo 服務(wù)提供者,實際的數(shù)據(jù)庫操作及業(yè)務(wù)層, springboot+maven項目 )

背景:

使用springmvc做restful,使用dubbo做rpc,restful中調(diào)用大量的rpc,數(shù)據(jù)驗證會在這兩個地方,一個是restful層面,一個是rpc層面,restful層面使用springmvc默認的集成hibernate-validator來實現(xiàn),參數(shù)開啟驗證只需要加入@Validated param。dubbo 使用 rpc 的校驗

dubbo rpc層面采用的是JSR303標準注解驗證,通過hibernate-validator實現(xiàn),dubbo中開啟validation也有兩個方式,一個是在consumer端,一個是在provider`端。

開啟dubbo 的服務(wù)端校驗時,調(diào)用dubbo 的服務(wù)時會在服務(wù)端進行參數(shù)校驗,如果在consumer 端也開啟了校驗則調(diào)用服務(wù)時也會在 consumer 端進行校驗

dubbo 的rpc 校驗 (服務(wù)端開啟)

首先配置dobbo 的rpc 層校驗

1.引入依賴,

 <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
    </dependency>

2.在api 的model 上添加注解

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

public class UserSaveArgs implements Serializable {

  private static final long serialVersionUID = -5457103531947646047L;
  @NotEmpty(
      message = "用戶名不能為空")
  @Pattern(regexp = Constants.USERNAME_PATTERN, message = "用戶名格式有誤")
  private String userName;
  @NotEmpty(
      message = "手機號不能為空")
  @Pattern(regexp = Constants.PHONTE_NUMBER_PATTERN, message = "手機號編碼格式有誤")
  private String phoneNumber;
  @NotNull(
      message = "年齡不能為空")
  @Min(value = 0, message = "年齡不能小于0")
  private Integer age;
  
  //get set 省略

在dubbo 配置文件 provider.xml 中開啟驗證 validation=“true”

  <dubbo:provider delay="-1" timeout="5000" threads="600" threadpool="fixed" loadbalance="roundrobin" accesslog="true"
          retries="0" validation="true"/>

消費端開啟

由于消費端引入了服務(wù)端的api 所以在消費端開啟校驗時只需在consumer.xml 中開啟驗證即可 validation=“true”

consumer 端開啟了校驗則在調(diào)用服務(wù)時會在 consumer 端進行參數(shù)校驗,不使用provider的資源進行校驗

<dubbo:consumer check="false" timeout="60000" retries="0" validation="true"/>

配置自定義異常處理解析 rpc 校驗異常

@ControllerAdvice
public class DefaultExceptionHandler {
 
 @ExceptionHandler({RpcException.class})
  @ResponseBody
  @ResponseStatus(HttpStatus.OK)
  public ResponseEntity RpcException(Exception ex, Model model) {
    logger.error("rpc接口參數(shù)校驗異常。{}", ex.getMessage());
    String errMsg = ((ConstraintViolationException) ex.getCause()).getConstraintViolations()
        .iterator().next().getMessage();
    //ResponseEntity 為自定義的返回類,非springframework.http.ResponseEntity,當然此處可以自己定義返回類,只需將 異常信息 errMsg 返回即可
    return ResponseEntity.error(ARG_ERROR_CODE, errMsg);
  }
}

Controller 驗證

也就是 test-rest 項目 由于是dubbo的消費者項目,也是springboot 項目。由于前端傳遞的參數(shù)需要在 此層包裝后進行調(diào)用服務(wù)。所以驗證前端傳遞的參數(shù)時 可以選擇使用 Springboot + validation 進行校驗

Spring3支持JSR-303驗證框架,JSR-303 是Java EE 6 中的一項子規(guī)范,叫做BeanValidation,官方參考實現(xiàn)是hibernate Validator(與Hibernate ORM 沒有關(guān)系),JSR 303 用于對Java Bean 中的字段的值進行驗證。

具體配置參照博客:springboot 使用校驗框架validation校驗

小問題

test-rest 和 test-provider 都引用了test-api 。如果test-rest 層的入?yún)⑶『门c test-provider的服務(wù)調(diào)用入?yún)⑾嗤?,則此時仍需在 test-rest 項目中 新建 入?yún)⒌?Java bean。

雖然 test-rest 的java bean 和 test-api 的Java bean 相同。但是Spring3 在解析的時候不能獲取到 test-api 的Java bean 校驗注解。所以需要校驗的時候仍然需要在 test-rest 項目中創(chuàng)建一個 和 test-api 的Java bean 相同 的java bean

附錄: 檢驗注解及含義

//(1)空檢查
@Null 驗證對象是否為null
@NotNull 驗證對象是否不為null, 無法查檢長度為0的字符串
@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.
@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
//(2)Booelan檢查
@AssertTrue 驗證 Boolean 對象是否為 true
@AssertFalse 驗證 Boolean 對象是否為 false
//(3)長度檢查
@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi)
@Length(min=, max=) 驗證字符串的長度在min和max范圍之內(nèi).
//(4)日期檢查
@Past 驗證 Date 和 Calendar 對象是否在當前時間之前,驗證成立的話被注釋的元素一定是一個過去的日期
@Future 驗證 Date 和 Calendar 對象是否在當前時間之后 ,驗證成立的話被注釋的元素一定是一個將來的日期
@Pattern 驗證 String 對象是否符合正則表達式的規(guī)則,被注釋的元素符合制定的正則表達式,regexp:正則表達式 flags: 指定 Pattern.Flag 的數(shù)組,表示正則表達式的相關(guān)選項。
//(5)數(shù)值檢查
建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為""時無法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min 驗證 Number 和 String 對象是否大等于指定的值
@Max 驗證 Number 和 String 對象是否小等于指定的值
@DecimalMax 被標注的值必須不大于約束中指定的最大值. 這個約束的參數(shù)是一個通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin 被標注的值必須不小于約束中指定的最小值. 這個約束的參數(shù)是一個通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
@Digits 驗證 Number 和 String 的構(gòu)成是否合法
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。
@Range(min=, max=) 被指定的元素必須在合適的范圍內(nèi)
@Valid 遞歸的對關(guān)聯(lián)對象進行校驗, 如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)
@CreditCardNumber信用卡驗證
@Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=

當然也可以自定義校驗注解:

此處本文不做展示,如需自定義校驗注解可查閱參考文檔

參考文檔:

http://www.dbjr.com.cn/article/170692.htm

http://www.dbjr.com.cn/article/155033.htm

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

相關(guān)文章

  • Java swing實現(xiàn)的計算器功能完整實例

    Java swing實現(xiàn)的計算器功能完整實例

    這篇文章主要介紹了Java swing實現(xiàn)的計算器功能,結(jié)合完整實例形式分析了java基于swing組件實現(xiàn)計算器布局與運算功能的具體操作技巧,需要的朋友可以參考下
    2017-12-12
  • 淺談Java編程中的synthetic關(guān)鍵字

    淺談Java編程中的synthetic關(guān)鍵字

    這篇文章主要介紹了淺談Java編程中的synthetic關(guān)鍵字的相關(guān)內(nèi)容,包括其簡單的介紹和實例,需要的朋友可以了解下。
    2017-09-09
  • 使用mybatis-plus分頁出現(xiàn)兩個Limit的問題解決

    使用mybatis-plus分頁出現(xiàn)兩個Limit的問題解決

    在使用MyBatis-Plus進行分頁查詢時,可能會遇到查詢SQL中出現(xiàn)兩個limit語句的問題,這通常是由于在多個模塊中重復(fù)引入了MyBatis-Plus的分頁插件所導(dǎo)致的,下面就來介紹一下如何解決,感興趣的可以了解一下
    2024-10-10
  • Java如何優(yōu)雅的實現(xiàn)微信登錄注冊

    Java如何優(yōu)雅的實現(xiàn)微信登錄注冊

    這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅的實現(xiàn)微信登錄注冊的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • Java高級之虛擬機加載機制的實例講解

    Java高級之虛擬機加載機制的實例講解

    下面小編就為大家分享一篇Java高級之虛擬機加載機制的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • java之super關(guān)鍵字用法實例解析

    java之super關(guān)鍵字用法實例解析

    這篇文章主要介紹了java之super關(guān)鍵字用法實例解析,較為詳細的分析了super關(guān)鍵字的用法及內(nèi)存分布,需要的朋友可以參考下
    2014-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動力節(jié)點Java學(xué)院整理)

    Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動力節(jié)點Java學(xué)院整理)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之棧,棧是先進后出的數(shù)據(jù)的結(jié)構(gòu),本文通過文字說明與實例代碼相結(jié)合的形式給大家介紹的非常詳細,需要的朋友跟著小編一起學(xué)習(xí)吧
    2017-04-04
  • SpringBoot如何實現(xiàn)一個實時更新的進度條的示例代碼

    SpringBoot如何實現(xiàn)一個實時更新的進度條的示例代碼

    本文詳細的介紹了SpringBoot如何實現(xiàn)一個實時更新的進度條,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java編程環(huán)境搭建和變量基本使用圖文教程

    Java編程環(huán)境搭建和變量基本使用圖文教程

    這篇文章主要介紹了Java編程環(huán)境搭建和變量基本使用,結(jié)合圖文形式詳細分析了java編程語言環(huán)境搭建、配置、變量、注釋的基本使用方法,需要的朋友可以參考下
    2020-02-02
  • 解析ConcurrentHashMap: 紅黑樹的代理類(TreeBin)

    解析ConcurrentHashMap: 紅黑樹的代理類(TreeBin)

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識,一起看看吧
    2021-06-06

最新評論