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

springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解

 更新時(shí)間:2023年07月12日 09:09:51   作者:Geroge1226  
這篇文章主要為大家介紹了springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1、說(shuō)明

后端接口設(shè)計(jì)時(shí)候,需要對(duì)前端請(qǐng)求參數(shù)進(jìn)行'先校驗(yàn)后處理業(yè)務(wù)'情況,如果在業(yè)務(wù)代碼中通過(guò)類似if這里逐個(gè)校驗(yàn),會(huì)使得代碼變得繁瑣,開(kāi)發(fā)工作者都是愛(ài)偷懶的。java中,Bean ValidationJavaBean的驗(yàn)證定義了相關(guān)的元數(shù)據(jù)模型和API。

基于Bean-Validation封裝,提供了更加豐富的Hibernate-Validation的校驗(yàn)包。也有開(kāi)發(fā)會(huì)把這類校驗(yàn)交給前端來(lái)處理,但是接口暴露外網(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)證方式,無(wú)需你再次編寫(xiě)重復(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

注解說(shuō)明
@AssertFalse注釋的元素必須為False
@AssertTrue注釋的元素必須為T(mén)rue
@Email注釋的元素必須郵箱
@NotBlank注釋的元素不能為空,!null && size>0
@NotEmpty注釋的元素不能為空,數(shù)組,集合等
@NotNull注釋的元素必須為空,但可以為""字符串
@DecimalMin注釋的元素?cái)?shù)字,最小不得小于Min
@DecimalMax注釋的元素為數(shù)字,最大不超過(guò)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

注解說(shuō)明
@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 Validationstart封裝(校驗(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&lt;Boolean&gt; 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)象

{
    &quot;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)文章!

相關(guān)文章

  • Java實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)好用的MybatisPlus代碼生成器

    Java實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)好用的MybatisPlus代碼生成器

    這篇文章主要介紹了Java實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)好用的MybatisPlus代碼生成器,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 詳解path和classpath的區(qū)別

    詳解path和classpath的區(qū)別

    這篇文章主要介紹了詳解path和classpath的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java 中String.equals和==的比較

    java 中String.equals和==的比較

    這篇文章主要介紹了java 中String.equals和==的比較的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • Java中實(shí)現(xiàn)對(duì)象深克隆的四種方式

    Java中實(shí)現(xiàn)對(duì)象深克隆的四種方式

    這篇文章主要介紹了如何在Java中實(shí)現(xiàn)對(duì)象的深克隆,可以通過(guò)手動(dòng)實(shí)現(xiàn)clone()方法、使用序列化、第三方庫(kù)Apache Commons Lang或Hutool等幾種方式,每種方式都有其特點(diǎn),需要的朋友可以參考下
    2025-10-10
  • 解決SpringBoot框架因post數(shù)據(jù)量過(guò)大沒(méi)反應(yīng)問(wèn)題(踩坑)

    解決SpringBoot框架因post數(shù)據(jù)量過(guò)大沒(méi)反應(yīng)問(wèn)題(踩坑)

    這篇文章主要介紹了解決SpringBoot框架因post數(shù)據(jù)量過(guò)大沒(méi)反應(yīng)問(wèn)題(踩坑),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JavaSE?XML解析技術(shù)的使用方法詳解

    JavaSE?XML解析技術(shù)的使用方法詳解

    XML意為可擴(kuò)展標(biāo)記語(yǔ)言,被多數(shù)技術(shù)人員用以選擇作為數(shù)據(jù)傳輸?shù)妮d體,成為一種通用的數(shù)據(jù)交換格式,下面這篇文章主要給大家介紹了關(guān)于JavaSE?XML解析技術(shù)的使用方法,需要的朋友可以參考下
    2023-04-04
  • SpringBoot2整合Redis實(shí)現(xiàn)讀寫(xiě)操作

    SpringBoot2整合Redis實(shí)現(xiàn)讀寫(xiě)操作

    Redis,對(duì)于大家來(lái)說(shuō)應(yīng)該不陌生,是經(jīng)常使用的開(kāi)發(fā)技術(shù)之一。本文將結(jié)合實(shí)例代碼,介紹SpringBoot2整合Redis實(shí)現(xiàn)讀寫(xiě)操作,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中泛型的示例詳解

    Java中泛型的示例詳解

    泛型機(jī)制在項(xiàng)目中一直都在使用,不僅如此,很多源碼中都用到了泛型機(jī)制。本文將通過(guò)一些示例帶大家深入了解一下Java的泛型機(jī)制,需要的可以了解一下
    2022-10-10
  • Java構(gòu)造方法實(shí)例詳解(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    Java構(gòu)造方法實(shí)例詳解(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    其實(shí)java構(gòu)造方法很簡(jiǎn)單,下面通過(guò)示例給大家分享java構(gòu)造方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-04-04

最新評(píng)論

常山县| 绍兴市| 西平县| 康平县| 新河县| 大庆市| 蕉岭县| 乐至县| 含山县| 宁安市| 台东县| 平安县| 长兴县| 克拉玛依市| 江都市| 龙里县| 上栗县| 义乌市| 罗平县| 兰西县| 大港区| 扎囊县| 青岛市| 巴里| 古丈县| 潜山县| 突泉县| 沙雅县| 柳林县| 泽库县| 赤城县| 响水县| 留坝县| 克拉玛依市| 丰城市| 亚东县| 获嘉县| 双柏县| 宁波市| 鸡西市| 石柱|