您好,登錄后才能下訂單哦!
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE
項目結構
背景:
使用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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。