springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解
1、說明
后端接口設(shè)計(jì)時(shí)候,需要對(duì)前端請(qǐng)求參數(shù)進(jìn)行'先校驗(yàn)后處理業(yè)務(wù)'情況,如果在業(yè)務(wù)代碼中通過類似if這里逐個(gè)校驗(yàn),會(huì)使得代碼變得繁瑣,開發(fā)工作者都是愛偷懶的。java中,Bean Validation
為JavaBean
的驗(yàn)證定義了相關(guān)的元數(shù)據(jù)模型和API。
基于Bean-Validation
封裝,提供了更加豐富的Hibernate-Validation
的校驗(yàn)包。也有開發(fā)會(huì)把這類校驗(yàn)交給前端來處理,但是接口暴露外網(wǎng)會(huì)存在直接調(diào)用情況(黃牛)。畢竟:前端校驗(yàn)是為了提高用戶的體驗(yàn)度,后端校驗(yàn)則是為了保證數(shù)據(jù)的安全性
優(yōu)點(diǎn)
1.驗(yàn)證邏輯與業(yè)務(wù)邏輯之間進(jìn)行了分離,降低了程序耦合度
2.統(tǒng)一且規(guī)范的驗(yàn)證方式,無需你再次編寫重復(fù)的驗(yàn)證代碼
3.你將更專注于你的業(yè)務(wù),將這些繁瑣的事情統(tǒng)統(tǒng)丟在一邊
2、Bean Validation與Hibernate Validation
2.1 Bean Validation中內(nèi)置的constraint
包位置路徑:javax.validation.constraints
注解 | 說明 |
---|---|
@AssertFalse | 注釋的元素必須為False |
@AssertTrue | 注釋的元素必須為True |
注釋的元素必須郵箱 | |
@NotBlank | 注釋的元素不能為空,!null && size>0 |
@NotEmpty | 注釋的元素不能為空,數(shù)組,集合等 |
@NotNull | 注釋的元素必須為空,但可以為""字符串 |
@DecimalMin | 注釋的元素?cái)?shù)字,最小不得小于Min |
@DecimalMax | 注釋的元素為數(shù)字,最大不超過Max值 |
其中NotNull、NotEmpty、NotBlank區(qū)別
- @NotNull
適用于基本數(shù)據(jù)類型(Integer,Long,Double等等),當(dāng) @NotNull 注解被使用在 String 類型的數(shù)據(jù)上,則表示該數(shù)據(jù)不能為 Null(但是可以為 Empty) - @NotBlank
適用于 String 類型的數(shù)據(jù)上,加了@NotBlank 注解的參數(shù)不能為 Null 且 trim() 之后 size > 0 - @NotEmpty
適用于 String、Collection集合、Map、數(shù)組等等,加了@NotEmpty 注解的參數(shù)不能為 Null 或者 長(zhǎng)度為 0
2.1 Hibernate Validation中添加的constraint
注解 | 說明 |
---|---|
@Length | 注釋的元素字符串長(zhǎng)度必須為制定返回內(nèi) |
@Range | 注釋的元素必須在指定范圍內(nèi) |
@URL | 注釋的元素必須為鏈接 |
3、基于Hibernate Validation的實(shí)現(xiàn)
(1)pom包引用
查看spring-boot-start-web
中已經(jīng)集成了Hibernate Validation
,所以可以不用額外引用包。同時(shí)spring-boot-start-validation
也完成了Hibernate Validation
的start
封裝(校驗(yàn)機(jī)制更加全面)。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.2.6.RELEASE</version> </dependency>
(2)Bean
對(duì)象中使用注解注釋
... @ApiModelProperty(value = "收貨人所在省",required = true) @NotNull(message = "省不能為空") private String recipientProvince; @ApiModelProperty(value = "收貨人所在市") @NotNull(message = "市不能為空") private String recipientCity; @ApiModelProperty(value = "收貨人所在區(qū)") @NotNull(message = "區(qū)不能為空") private String recipientDistrict; ...
(3)Controller
層使用@Valid
或者@Validated
@PostMapping("/add") public UniformResultTemplate<Boolean> addAddress(@RequestBody @Validated AddressReqDto reqDto, HttpServletRequest request){ return null; }
注意:Post請(qǐng)求方式區(qū)別,Get@Validated注解需要加在 所在方法類前
@RestController @RequestMapping("/api/address") @Validated public class AddressController extends BaseController{ @ApiOperation("收獲地址詳情") @GetMapping("/detail") public UniformResultTemplate<AddressDetailRespDto> queryAddressList(@NotNull(message = "地址Id不能為空") @RequestParam(value = "addressId") Long addressId, HttpServletRequest request){ return null; } }
(4)使用@ControllerAdvice
統(tǒng)一異常處理返回。
@Component @ControllerAdvice @Slf4j public class GlobalExceptionHandler { // Post請(qǐng)求Bean中的校驗(yàn)拋出:MethodArgumentNotValidException @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public UniformResultTemplate handleBindException(MethodArgumentNotValidException ex) { FieldError fieldError = ex.getBindingResult().getFieldError(); log.warn("參數(shù)校驗(yàn)異常:{}({})", fieldError.getDefaultMessage(),fieldError.getField()); return new UniformResultTemplate("10002",fieldError.getDefaultMessage()); } // Get請(qǐng)求的參數(shù)校驗(yàn),拋出的是ConstraintViolationException @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public UniformResultTemplate handleGetBindException(ConstraintViolationException ex) { Set<ConstraintViolation<?>> eSet = ex.getConstraintViolations(); StringBuffer sb = new StringBuffer(); if(!CollectionUtils.isEmpty(eSet)) { Iterator<ConstraintViolation<?>> iterator = eSet.iterator(); while (iterator.hasNext()) { log.warn("參數(shù)校驗(yàn)異常:{}({})", iterator.next().getMessage()); sb.append(iterator.next().getMessage()).append("::"); } } return new UniformResultTemplate("10002",sb.toString()); } // 方法簽名參數(shù)錯(cuò)誤 @ExceptionHandler(MissingServletRequestParameterException.class) @ResponseBody public UniformResultTemplate handleGetBindException(MissingServletRequestParameterException ex) { log.warn("參數(shù)校驗(yàn)異常:{}", ex.getMessage()); return new UniformResultTemplate("10002",ex.getMessage()); } }
(5)結(jié)果現(xiàn)象
{
"code": "10002",
"message": "市不能為空",
"result": null,
"totalTimes": null,
"interfaceTimes": null
}
4、編譯器校驗(yàn)工具
防止因使用錯(cuò)誤Hibernate-Validation注解而導(dǎo)致程序運(yùn)行時(shí)報(bào)錯(cuò),增加編譯器校驗(yàn)工具,進(jìn)行友好提示。
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>6.1.5.Final</version> </dependency>
以上就是springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解的詳細(xì)內(nèi)容,更多關(guān)于springboot Hibernate-Validation的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot + validation 接口參數(shù)校驗(yàn)的思路詳解
- Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- spring?boot?validation參數(shù)校驗(yàn)與分組嵌套各種類型及使用小結(jié)
- SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
- spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn)
- spring boot輸入數(shù)據(jù)校驗(yàn)(validation)的實(shí)現(xiàn)過程
- 從零到掌握Spring Boot Validation 接口校驗(yàn)的詳細(xì)過程
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Java 將Excel轉(zhuǎn)為OFD格式(方法步驟)
OFD是一種開放版式文檔是我國(guó)國(guó)家版式文檔格式標(biāo)準(zhǔn),本文通過Java后端程序代碼展示如何將Excel轉(zhuǎn)為OFD格式,分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2021-12-12SpringBoot對(duì)Controller進(jìn)行單元測(cè)試的實(shí)現(xiàn)代碼 附亂碼解決方案
這篇文章主要介紹了SpringBoot對(duì)Controller進(jìn)行單元測(cè)試的實(shí)現(xiàn)代碼 附亂碼解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn)
本篇文章主要介紹了SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05BeanFactory與ApplicationContext的區(qū)別示例解析
這篇文章主要為大家介紹了BeanFactory與ApplicationContext的區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Spring實(shí)現(xiàn)默認(rèn)標(biāo)簽解析流程
這篇文章主要為大家詳細(xì)介紹了Spring實(shí)現(xiàn)默認(rèn)標(biāo)簽解析流程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01