springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法
注意:本文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í)有所幫助,也希望大家多多支持腳本之家。
- Spring?Boot集成validation實現(xiàn)參數(shù)校驗功能
- SpringBoot使用Validation包進行輸入?yún)?shù)校驗
- SpringBoot使用Validation進行參數(shù)校驗的示例詳解
- SpringBoot集成Validation參數(shù)校驗
- SpringBoot使用validation做參數(shù)校驗的實現(xiàn)步驟
- SpringBoot使用validation-api實現(xiàn)對枚舉類參數(shù)校驗的方法
- SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例
- spring boot validation參數(shù)校驗實例分析
- spring?參數(shù)校驗Validation示例詳解
相關(guān)文章
使用mybatis-plus分頁出現(xiàn)兩個Limit的問題解決
在使用MyBatis-Plus進行分頁查詢時,可能會遇到查詢SQL中出現(xiàn)兩個limit語句的問題,這通常是由于在多個模塊中重復(fù)引入了MyBatis-Plus的分頁插件所導(dǎo)致的,下面就來介紹一下如何解決,感興趣的可以了解一下2024-10-10Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動力節(jié)點Java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之棧,棧是先進后出的數(shù)據(jù)的結(jié)構(gòu),本文通過文字說明與實例代碼相結(jié)合的形式給大家介紹的非常詳細,需要的朋友跟著小編一起學(xué)習(xí)吧2017-04-04SpringBoot如何實現(xiàn)一個實時更新的進度條的示例代碼
本文詳細的介紹了SpringBoot如何實現(xiàn)一個實時更新的進度條,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05解析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