springboot整合JSR303校驗功能實現(xiàn)代碼
JSR303簡介
JSR-303 是 JAVA EE 6 中的一項子規(guī)范,叫做 Bean Validation,官方參考實現(xiàn)是Hibernate Validator。Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實現(xiàn),除此之外還有一些附加的 constraint。
4.7 JSR303校驗
4.7.1 統(tǒng)一校驗的需求
前端請求后端接口傳輸參數(shù),是在controller中校驗還是在Service中校驗?
答案是都需要校驗,只是分工不同。
Contoller中校驗請求參數(shù)的合法性,包括:必填項校驗,數(shù)據(jù)格式校驗,比如:是否是符合一定的日期格式,等。
Service中要校驗的是業(yè)務規(guī)則相關(guān)的內(nèi)容,比如:課程已經(jīng)審核通過所以提交失敗。
Service中根據(jù)業(yè)務規(guī)則去校驗不方便寫成通用代碼,Controller中則可以將校驗的代碼寫成通用代碼。
早在JavaEE6規(guī)范中就定義了參數(shù)校驗的規(guī)范,它就是JSR-303,它定義了Bean Validation,即對bean屬性進行校驗。
SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底層使用Hibernate Validator,Hibernate Validator是Bean Validation 的參考實現(xiàn)。
所以,我們準備在Controller層使用spring-boot-starter-validation完成對請求參數(shù)的基本合法性進行校驗。
4.7.2 統(tǒng)一校驗實現(xiàn)
首先在Base工程添加spring-boot-starter-validation的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>現(xiàn)在準備對內(nèi)容管理模塊添加課程接口進行參數(shù)校驗,如下接口
@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody AddCourseDto addCourseDto){
//機構(gòu)id,由于認證系統(tǒng)沒有上線暫時硬編碼
Long companyId = 1L;
return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}此接口使用AddCourseDto模型對象接收參數(shù),所以進入AddCourseDto類,在屬性上添加校驗規(guī)則。
package com.xuecheng.content.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
/**
* @description 添加課程dto
* @author Mr.M
* @date 2022/9/7 17:40
* @version 1.0
*/
@Data
@ApiModel(value="AddCourseDto", description="新增課程基本信息")
public class AddCourseDto {
@NotEmpty(message = "課程名稱不能為空")
@ApiModelProperty(value = "課程名稱", required = true)
private String name;
@NotEmpty(message = "適用人群不能為空")
@Size(message = "適用人群內(nèi)容過少",min = 10)
@ApiModelProperty(value = "適用人群", required = true)
private String users;
@ApiModelProperty(value = "課程標簽")
private String tags;
@NotEmpty(message = "課程分類不能為空")
@ApiModelProperty(value = "大分類", required = true)
private String mt;
@NotEmpty(message = "課程分類不能為空")
@ApiModelProperty(value = "小分類", required = true)
private String st;
@NotEmpty(message = "課程等級不能為空")
@ApiModelProperty(value = "課程等級", required = true)
private String grade;
@ApiModelProperty(value = "教學模式(普通,錄播,直播等)", required = true)
private String teachmode;
@ApiModelProperty(value = "課程介紹")
private String description;
@ApiModelProperty(value = "課程圖片", required = true)
private String pic;
@NotEmpty(message = "收費規(guī)則不能為空")
@ApiModelProperty(value = "收費規(guī)則,對應數(shù)據(jù)字典", required = true)
private String charge;
@ApiModelProperty(value = "價格")
private BigDecimal price;
}
上邊用到了@NotEmpty和@Size兩個注解,@NotEmpty表示屬性不能為空,@Size表示限制屬性內(nèi)容的長短。
在javax.validation.constraints包下有很多這樣的校驗注解

規(guī)則如下:

定義好校驗規(guī)則還需要開啟校驗,在controller方法中添加@Validated注解,如下:
@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated AddCourseDto addCourseDto){
//機構(gòu)id,由于認證系統(tǒng)沒有上線暫時硬編碼
Long companyId = 1L;
return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}如果校驗出錯Spring會拋出MethodArgumentNotValidException異常,我們需要在統(tǒng)一異常處理器中捕獲異常,解析出異常信息。
代碼 如下:
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse doValidException(MethodArgumentNotValidException argumentNotValidException) {
BindingResult bindingResult = argumentNotValidException.getBindingResult();
StringBuffer errMsg = new StringBuffer();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
fieldErrors.forEach(error -> {
errMsg.append(error.getDefaultMessage()).append(",");
});
log.error(errMsg.toString());
return new RestErrorResponse(errMsg.toString());
}重啟內(nèi)容管理服務。
使用httpclient進行測試,將必填項設(shè)置為空,“適用人群” 屬性的內(nèi)容設(shè)置1個字。
執(zhí)行測試,接口響應結(jié)果如下:
{
"errMessage": "課程名稱不能為空 課程分類不能為空 課程分類不能為空 適用人群內(nèi)容過少 "
}
可以看到校驗器生效。
4.7.3 分組校驗
有時候在同一個屬性上設(shè)置一個校驗規(guī)則不能滿足要求,比如:訂單編號由系統(tǒng)生成,在添加訂單時要求訂單編號為空,在更新 訂單時要求訂單編寫不能為空。此時就用到了分組校驗,同一個屬性定義多個校驗規(guī)則屬于不同的分組,比如:添加訂單定義@NULL規(guī)則屬于insert分組,更新訂單定義@NotEmpty規(guī)則屬于update分組,insert和update是分組的名稱,是可以修改的。
下邊舉例說明
我們用class類型來表示不同的分組,所以我們定義不同的接口類型(空接口)表示不同的分組,由于校驗分組是公用的,所以定義在 base工程中。如下:
package com.xuecheng.base.execption;
/**
* @description 校驗分組
* @author Mr.M
* @date 2022/9/8 15:05
* @version 1.0
*/
public class ValidationGroups {
public interface Inster{};
public interface Update{};
public interface Delete{};
}下邊在定義校驗規(guī)則時指定分組:
@NotEmpty(groups = {ValidationGroups.Inster.class},message = "添加課程名稱不能為空")
@NotEmpty(groups = {ValidationGroups.Update.class},message = "修改課程名稱不能為空")
// @NotEmpty(message = "課程名稱不能為空")
@ApiModelProperty(value = "課程名稱", required = true)
private String name;在Controller方法中啟動校驗規(guī)則指定要使用的分組名:
@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){
//機構(gòu)id,由于認證系統(tǒng)沒有上線暫時硬編碼
Long companyId = 1L;
return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}再次測試,由于這里指定了Insert分組,所以拋出 異常信息:添加課程名稱不能為空。
如果修改分組為ValidationGroups.Update.class,異常信息為:修改課程名稱不能為空。
4.7.4 校驗規(guī)則不滿足?
如果javax.validation.constraints包下的校驗規(guī)則滿足不了需求怎么辦?
1、手寫校驗代碼 。
2、自定義校驗規(guī)則注解。
如何自定義校驗規(guī)則注解,請自行查閱資料實現(xiàn)。
到此這篇關(guān)于springboot整合JSR303校驗的文章就介紹到這了,更多相關(guān)springboot整合JSR303校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot集成JSR303參數(shù)校驗的方法實現(xiàn)
- Spring Boot利用JSR303實現(xiàn)參數(shù)驗證的方法實例
- SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進行校驗的示例代碼
- SpringBoot使用jsr303校驗的實現(xiàn)
- Spring中使用JSR303請求約束判空的實現(xiàn)
- SpringBoot后端進行數(shù)據(jù)校驗JSR303的使用詳解
- springboot接口參數(shù)校驗JSR303的實現(xiàn)
- springboot整合JSR303參數(shù)校驗與全局異常處理的方法
- SpringMVC中的JSR303與攔截器的使用方法
相關(guān)文章
基于JavaSwing設(shè)計和實現(xiàn)的酒店管理系統(tǒng)
這篇文章主要介紹了基于JavaSwing+mysql的酒店管理系統(tǒng)設(shè)計和實現(xiàn),它可以實現(xiàn)酒店日常的管理功能包括開房、退房、房間信息、顧客信息管理等2021-08-08
JavaWeb搭建網(wǎng)上圖書商城畢業(yè)設(shè)計
這篇文章主要介紹了JavaWeb搭建網(wǎng)上圖書商城框架,特別適合正在為網(wǎng)上商城畢業(yè)設(shè)計煩惱的同學,需要的朋友可以參考下2015-11-11
解決idea check out 切換分支時找不到需要的分支問題
這篇文章主要介紹了解決idea check out 切換分支時找不到需要的分支問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
SpringBoot重寫addResourceHandlers映射文件路徑方式
這篇文章主要介紹了SpringBoot重寫addResourceHandlers映射文件路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java 多線程同步 鎖機制與synchronized深入解析
從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒上鎖房間里的一塊用帶鎖的屏風隔開的空間2013-09-09

