目錄
1:JSR303校驗(yàn)
1.1:統(tǒng)一校驗(yàn)的需求
1.2:統(tǒng)一校驗(yàn)實(shí)現(xiàn)
1.3:分組校驗(yàn)
1.4:校驗(yàn)規(guī)則不滿足?
1:JSR303校驗(yàn)
1.1:統(tǒng)一校驗(yàn)的需求
前端請求后端接口傳輸參數(shù),是在controller中校驗(yàn)還是在Service中校驗(yàn)?
答案是都需要校驗(yàn),只是分工不同。
Contoller中校驗(yàn)請求參數(shù)的合法性,包括:必填項(xiàng)校驗(yàn),數(shù)據(jù)格式校驗(yàn),比如:是否是符合一定的日期格式,等。
Service中要校驗(yàn)的是業(yè)務(wù)規(guī)則相關(guān)的內(nèi)容,比如:課程已經(jīng)審核通過所以提交失敗。
Service中根據(jù)業(yè)務(wù)規(guī)則去校驗(yàn)不方便寫成通用代碼,Controller中則可以將校驗(yàn)的代碼寫成通用代碼。
早在JavaEE6規(guī)范中就定義了參數(shù)校驗(yàn)的規(guī)范,它就是JSR-303,它定義了Bean Validation,即對bean屬性進(jìn)行校驗(yàn)。
SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底層使用Hibernate Validator,Hibernate Validator是Bean Validation 的參考實(shí)現(xiàn)。
所以,我們準(zhǔn)備在Controller層使用spring-boot-starter-validation完成對請求參數(shù)的基本合法性進(jìn)行校驗(yàn)。
1.2:統(tǒng)一校驗(yàn)實(shí)現(xiàn)
首先添加依賴
Java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在javax.validation.constraints包下有很多這樣的校驗(yàn)注解,直接使用注解定義校驗(yàn)規(guī)則即可。
規(guī)則如下:
示例:一個(gè)接口的參數(shù)校驗(yàn)
@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 = "課程標(biāo)簽")
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 = "教學(xué)模式(普通,錄播,直播等)", required = true)
private String teachmode;
@ApiModelProperty(value = "課程介紹")
private String description;
@ApiModelProperty(value = "課程圖片", required = true)
private String pic;
@NotEmpty(message = "收費(fèi)規(guī)則不能為空")
@ApiModelProperty(value = "收費(fèi)規(guī)則,對應(yīng)數(shù)據(jù)字典", required = true)
private String charge;
@ApiModelProperty(value = "價(jià)格")
private Float price;
@ApiModelProperty(value = "原價(jià)")
private Float originalPrice;
@ApiModelProperty(value = "qq")
private String qq;
@ApiModelProperty(value = "微信")
private String wechat;
@ApiModelProperty(value = "電話")
private String phone;
@ApiModelProperty(value = "有效期")
private Integer validDays;
}
?上邊用到了@NotEmpty和@Size兩個(gè)注解,@NotEmpty表示屬性不能為空,@Size表示限制屬性內(nèi)容的長短。
?定義好校驗(yàn)規(guī)則還需要開啟校驗(yàn),在controller方法中添加@Validated注解,如下
如果校驗(yàn)出錯Spring會拋出MethodArgumentNotValidException異常,我們需要在統(tǒng)一異常處理器中捕獲異常,解析出異常信息。
@ResponseBody
//處理器捕獲入口參數(shù)報(bào)的錯誤進(jìn)入該方法內(nèi)進(jìn)行處理
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse methodArgumentNotValidException(MethodArgumentNotValidException e){
//創(chuàng)建一個(gè)集合進(jìn)行接收不合法信息
List<String> msgList = new ArrayList<>();
BindingResult bindingResult = e.getBindingResult();
//入口參數(shù)校驗(yàn),可能有多個(gè)參數(shù)信息都不合法,存放
bindingResult.getFieldErrors().stream().forEach(fieldError -> msgList.add(fieldError.getDefaultMessage()));
//處理集合內(nèi)的不合法提示,為字符串
String msg = StringUtils.join(msgList, ",");
//記錄異常
log.error("系統(tǒng)異常{}",msg);
//解析出異常信息
RestErrorResponse restErrorResponse = new RestErrorResponse(msg);
return restErrorResponse;
}
使用httpclient進(jìn)行測試一下
?
可以看到校驗(yàn)器生效。?
1.3:分組校驗(yàn)
有時(shí)候在同一個(gè)屬性上設(shè)置一個(gè)校驗(yàn)規(guī)則不能滿足要求,比如:訂單編號由系統(tǒng)生成,在添加訂單時(shí)要求訂單編號為空,在更新 訂單時(shí)要求訂單編寫不能為空。此時(shí)就用到了分組校驗(yàn),同一個(gè)屬性定義多個(gè)校驗(yàn)規(guī)則屬于不同的分組,比如:添加訂單定義@NULL規(guī)則屬于insert分組,更新訂單定義@NotEmpty規(guī)則屬于update分組,insert和update是分組的名稱,是可以修改的。
下邊舉例說明
我們用class類型來表示不同的分組,所以我們定義不同的接口類型(空接口)表示不同的分組,由于校驗(yàn)分組是公用的,所以定義在 公共調(diào)用的工程中。如下:
/**
* 定義一個(gè)校驗(yàn)分組
*/
public class ValidationGroups {
public interface Inster{};
public interface Update{};
public interface Delete{};
}
在接收參數(shù)的模型類中進(jìn)行填寫分組
?在Controller方法中啟動校驗(yàn)規(guī)則指定要使用的分組名:
?再次測試,由于這里指定了update分組,所以拋出 異常信息:添加課程名稱不能為空。
如果修改分組為ValidationGroups.Inster.class,異常信息為:修改課程名稱不能為空。
?
1.4:校驗(yàn)規(guī)則不滿足?
如果javax.validation.constraints包下的校驗(yàn)規(guī)則滿足不了需求怎么辦?
1、手寫校驗(yàn)代碼 。
2、自定義校驗(yàn)規(guī)則注解。文章來源:http://www.zghlxwxcb.cn/news/detail-426786.html
如何自定義校驗(yàn)規(guī)則注解,請自行查閱資料實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-426786.html
到了這里,關(guān)于接收來自客戶端的參數(shù)使用【JSR303校驗(yàn)框架】進(jìn)行校驗(yàn)參數(shù)是否合法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!