亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot+dubbo+validation 進行rpc參數校驗的實現方法

發布時間:2020-09-08 15:42:49 來源:腳本之家 閱讀:514 作者:雙斜杠少年 欄目:編程語言

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

項目結構

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

背景:

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

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

開啟dubbo 的服務端校驗時,調用dubbo 的服務時會在服務端進行參數校驗,如果在consumer 端也開啟了校驗則調用服務時也會在 consumer 端進行校驗

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

首先配置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"/>

消費端開啟

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

consumer 端開啟了校驗則在調用服務時會在 consumer 端進行參數校驗,不使用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接口參數校驗異常。{}", 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 項目。由于前端傳遞的參數需要在 此層包裝后進行調用服務。所以驗證前端傳遞的參數時 可以選擇使用 Springboot + validation 進行校驗

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

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

小問題

test-rest 和 test-provider 都引用了test-api 。如果test-rest 層的入參恰好與 test-provider的服務調用入參相同,則此時仍需在 test-rest 項目中 新建 入參的 Java bean。

雖然 test-rest 的java bean 和 test-api 的Java bean 相同。但是Spring3 在解析的時候不能獲取到 test-api 的Java bean 校驗注解。所以需要校驗的時候仍然需要在 test-rest 項目中創建一個 和 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)長度是否在給定的范圍之內
@Length(min=, max=) 驗證字符串的長度在min和max范圍之內.
//(4)日期檢查
@Past 驗證 Date 和 Calendar 對象是否在當前時間之前,驗證成立的話被注釋的元素一定是一個過去的日期
@Future 驗證 Date 和 Calendar 對象是否在當前時間之后 ,驗證成立的話被注釋的元素一定是一個將來的日期
@Pattern 驗證 String 對象是否符合正則表達式的規則,被注釋的元素符合制定的正則表達式,regexp:正則表達式 flags: 指定 Pattern.Flag 的數組,表示正則表達式的相關選項。
//(5)數值檢查
建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為""時無法轉換為int,但可以轉換為Stirng為"",Integer為null
@Min 驗證 Number 和 String 對象是否大等于指定的值
@Max 驗證 Number 和 String 對象是否小等于指定的值
@DecimalMax 被標注的值必須不大于約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度
@DecimalMin 被標注的值必須不小于約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度
@Digits 驗證 Number 和 String 的構成是否合法
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。
@Range(min=, max=) 被指定的元素必須在合適的范圍內
@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)
@CreditCardNumber信用卡驗證
@Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=

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

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

參考文檔:

https://www.jb51.net/article/170692.htm

https://www.jb51.net/article/155033.htm

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

磴口县| 黄浦区| 丰都县| 八宿县| 霍州市| 磐石市| 永川市| 海伦市| 太仆寺旗| 康马县| 象山县| 日土县| 将乐县| 彩票| 阿拉善右旗| 广河县| 泾川县| 莫力| 常山县| 宁武县| 曲阜市| 奉节县| 仁化县| 青州市| 景东| 道孚县| 章丘市| 济宁市| 集安市| 合阳县| 乐至县| 广宗县| 南江县| 龙海市| 贵阳市| 连江县| 康乐县| 蚌埠市| 浦县| 古交市| 克东县|