最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼

 更新時間:2023年01月15日 11:00:43   作者:林尋星辰  
這篇文章主要介紹了springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn),JSR303校驗(yàn)方法有統(tǒng)一校驗(yàn)的需求,統(tǒng)一校驗(yàn)實(shí)現(xiàn)以及分組校驗(yàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

JSR303簡介

JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,官方參考實(shí)現(xiàn)是Hibernate Validator。Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實(shí)現(xiàn),除此之外還有一些附加的 constraint。

4.7 JSR303校驗(yàn)

4.7.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)。

4.7.2 統(tǒng)一校驗(yàn)實(shí)現(xiàn)

首先在Base工程添加spring-boot-starter-validation的依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

現(xiàn)在準(zhǔn)備對內(nèi)容管理模塊添加課程接口進(jìn)行參數(shù)校驗(yàn),如下接口

@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody AddCourseDto addCourseDto){
    //機(jī)構(gòu)id,由于認(rèn)證系統(tǒng)沒有上線暫時硬編碼
    Long companyId = 1L;
  return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}

此接口使用AddCourseDto模型對象接收參數(shù),所以進(jìn)入AddCourseDto類,在屬性上添加校驗(yàn)規(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 = "課程標(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 = "價格")
 private BigDecimal price;

}

上邊用到了@NotEmpty和@Size兩個注解,@NotEmpty表示屬性不能為空,@Size表示限制屬性內(nèi)容的長短。

在javax.validation.constraints包下有很多這樣的校驗(yàn)注解

規(guī)則如下:

定義好校驗(yàn)規(guī)則還需要開啟校驗(yàn),在controller方法中添加@Validated注解,如下:

@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated AddCourseDto addCourseDto){
    //機(jī)構(gòu)id,由于認(rèn)證系統(tǒng)沒有上線暫時硬編碼
    Long companyId = 1L;
  return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}

如果校驗(yàn)出錯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)容管理服務(wù)。

使用httpclient進(jìn)行測試,將必填項(xiàng)設(shè)置為空,“適用人群” 屬性的內(nèi)容設(shè)置1個字。

執(zhí)行測試,接口響應(yīng)結(jié)果如下:

{
  "errMessage": "課程名稱不能為空 課程分類不能為空 課程分類不能為空 適用人群內(nèi)容過少 "
}

可以看到校驗(yàn)器生效。

4.7.3 分組校驗(yàn)

有時候在同一個屬性上設(shè)置一個校驗(yàn)規(guī)則不能滿足要求,比如:訂單編號由系統(tǒng)生成,在添加訂單時要求訂單編號為空,在更新 訂單時要求訂單編寫不能為空。此時就用到了分組校驗(yàn),同一個屬性定義多個校驗(yàn)規(guī)則屬于不同的分組,比如:添加訂單定義@NULL規(guī)則屬于insert分組,更新訂單定義@NotEmpty規(guī)則屬于update分組,insert和update是分組的名稱,是可以修改的。

下邊舉例說明

我們用class類型來表示不同的分組,所以我們定義不同的接口類型(空接口)表示不同的分組,由于校驗(yàn)分組是公用的,所以定義在 base工程中。如下:

package com.xuecheng.base.execption;
 /**
 * @description 校驗(yàn)分組
 * @author Mr.M
 * @date 2022/9/8 15:05
 * @version 1.0
 */
public class ValidationGroups {

 public interface Inster{};
 public interface Update{};
 public interface Delete{};

}

下邊在定義校驗(yàn)規(guī)則時指定分組:

@NotEmpty(groups = {ValidationGroups.Inster.class},message = "添加課程名稱不能為空")
 @NotEmpty(groups = {ValidationGroups.Update.class},message = "修改課程名稱不能為空")
// @NotEmpty(message = "課程名稱不能為空")
 @ApiModelProperty(value = "課程名稱", required = true)
 private String name;

在Controller方法中啟動校驗(yàn)規(guī)則指定要使用的分組名:

@ApiOperation("新增課程基礎(chǔ)信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){
    //機(jī)構(gòu)id,由于認(rèn)證系統(tǒng)沒有上線暫時硬編碼
    Long companyId = 1L;
  return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}

再次測試,由于這里指定了Insert分組,所以拋出 異常信息:添加課程名稱不能為空。

如果修改分組為ValidationGroups.Update.class,異常信息為:修改課程名稱不能為空。

4.7.4 校驗(yàn)規(guī)則不滿足?

如果javax.validation.constraints包下的校驗(yàn)規(guī)則滿足不了需求怎么辦?

1、手寫校驗(yàn)代碼 。

2、自定義校驗(yàn)規(guī)則注解。

如何自定義校驗(yàn)規(guī)則注解,請自行查閱資料實(shí)現(xiàn)。

到此這篇關(guān)于springboot整合JSR303校驗(yàn)的文章就介紹到這了,更多相關(guān)springboot整合JSR303校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對于提供個性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下
    2023-11-11
  • 基于JavaSwing設(shè)計(jì)和實(shí)現(xiàn)的酒店管理系統(tǒng)

    基于JavaSwing設(shè)計(jì)和實(shí)現(xiàn)的酒店管理系統(tǒng)

    這篇文章主要介紹了基于JavaSwing+mysql的酒店管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn),它可以實(shí)現(xiàn)酒店日常的管理功能包括開房、退房、房間信息、顧客信息管理等
    2021-08-08
  • JavaWeb搭建網(wǎng)上圖書商城畢業(yè)設(shè)計(jì)

    JavaWeb搭建網(wǎng)上圖書商城畢業(yè)設(shè)計(jì)

    這篇文章主要介紹了JavaWeb搭建網(wǎng)上圖書商城框架,特別適合正在為網(wǎng)上商城畢業(yè)設(shè)計(jì)煩惱的同學(xué),需要的朋友可以參考下
    2015-11-11
  • 解決idea check out 切換分支時找不到需要的分支問題

    解決idea check out 切換分支時找不到需要的分支問題

    這篇文章主要介紹了解決idea check out 切換分支時找不到需要的分支問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot3如何集成Hazelcast

    SpringBoot3如何集成Hazelcast

    Hazelcast是一款優(yōu)秀的開源內(nèi)存數(shù)據(jù)網(wǎng)格平臺,它能夠提供分布式數(shù)據(jù)存儲和緩存解決方案,通過與SpringBoot3的整合,開發(fā)者可以輕松實(shí)現(xiàn)分布式緩存、數(shù)據(jù)共享和會話管理等功能,Hazelcast的內(nèi)存數(shù)據(jù)網(wǎng)格特性支持高性能的緩存系統(tǒng),能夠減少數(shù)據(jù)庫訪問次數(shù),提升應(yīng)用性能
    2024-10-10
  • java字符緩沖流面試精講

    java字符緩沖流面試精講

    這篇文章主要為大家介紹了java中字符緩沖流面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java.lang.String類的使用

    java.lang.String類的使用

    這篇文章主要介紹了java.lang.String類的使用,以及字符串的相關(guān)知識,需要了解相關(guān)知識的小伙伴可以參考該篇文章
    2021-08-08
  • SpringBoot重寫addResourceHandlers映射文件路徑方式

    SpringBoot重寫addResourceHandlers映射文件路徑方式

    這篇文章主要介紹了SpringBoot重寫addResourceHandlers映射文件路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • mybatis-plus中更新null值的問題解決

    mybatis-plus中更新null值的問題解決

    本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • Java 多線程同步 鎖機(jī)制與synchronized深入解析

    Java 多線程同步 鎖機(jī)制與synchronized深入解析

    從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒上鎖房間里的一塊用帶鎖的屏風(fēng)隔開的空間
    2013-09-09

最新評論

正宁县| 三亚市| 松滋市| 门头沟区| 翁牛特旗| 张家港市| 柳江县| 五峰| 乐平市| 六安市| 桦甸市| 和林格尔县| 蒲城县| 清镇市| 岑溪市| 吉安市| 满洲里市| 府谷县| 天水市| 裕民县| 通山县| 京山县| 扎鲁特旗| 略阳县| 兰溪市| 乌苏市| 吴江市| 贞丰县| 元氏县| 利津县| 三都| 集安市| 安化县| 咸阳市| 闽清县| 临湘市| 西吉县| 泗洪县| 施甸县| 盐津县| 林周县|