欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring使用validation參數(shù)及全局異常檢測(cè)方式

 更新時(shí)間:2025年02月07日 09:05:08   作者:jforgame  
本文主要介紹了Java的數(shù)據(jù)校驗(yàn)規(guī)范validation-api,包括其定義的注解和HibernateValidator的實(shí)現(xiàn),還介紹了spring-boot-starter-validation的使用,可以讓開發(fā)者在SpringBoot應(yīng)用中簡(jiǎn)化數(shù)據(jù)校驗(yàn)的功能

1.validation參數(shù)驗(yàn)證工具

1.1.validation-api技術(shù)鏈

validation-api是一個(gè)Java的數(shù)據(jù)校驗(yàn)規(guī)范,它定義了一套用于校驗(yàn)Java Bean的API。它是JSR 303規(guī)范的一部分,也被稱為Bean Validation。validation-api提供了一系列的注解,用于在Java類的字段、方法參數(shù)和方法返回值上添加校驗(yàn)規(guī)則。這些注解包括@NotNull、@Size、@Min、@Max等等,每個(gè)注解都有特定的校驗(yàn)規(guī)則,用于驗(yàn)證數(shù)據(jù)是否滿足特定的條件。

Hibernate Validator是validation-api的唯一實(shí)現(xiàn)。除了提供注解和校驗(yàn)規(guī)則,Hibernate Validator還提供了一系列的工具類和接口,用于處理校驗(yàn)結(jié)果和錯(cuò)誤信息。它可以將校驗(yàn)結(jié)果封裝為一個(gè)Validator對(duì)象,并提供了各種方法來獲取校驗(yàn)結(jié)果、錯(cuò)誤信息和錯(cuò)誤類型。Hibernate Validator還支持國(guó)際化,可以根據(jù)不同的語言環(huán)境顯示相應(yīng)的錯(cuò)誤信息。它還提供了可自定義的錯(cuò)誤消息模板,可以根據(jù)實(shí)際需求來設(shè)置錯(cuò)誤消息的格式和內(nèi)容。

spring-boot-starter-validation是一個(gè)Spring Boot的starter,用于集成和簡(jiǎn)化Spring框架中的數(shù)據(jù)校驗(yàn)功能。spring-boot-starter-validation通過自動(dòng)配置的方式,將Hibernate Validator集成到了Spring Boot的應(yīng)用中,從而簡(jiǎn)化了數(shù)據(jù)校驗(yàn)的配置過程。通過引入這個(gè)starter,我們可以在應(yīng)用中使用標(biāo)準(zhǔn)的注解來進(jìn)行數(shù)據(jù)校驗(yàn),而不需要手動(dòng)配置和引入相關(guān)的依賴項(xiàng)。

1.2.validation常用注解

validation-api提供了一些常用的注解

@NotNull用于校驗(yàn)字段或方法參數(shù)的值不能為空
@NotEmpty用于校驗(yàn)字符串、集合或數(shù)組的值不能為空,且長(zhǎng)度不能為0
@NotBlank用于校驗(yàn)字符串的值不能為空或只包含空格
@Size用于校驗(yàn)字符串、集合或數(shù)組的長(zhǎng)度是否在指定范圍內(nèi)
@Min用于校驗(yàn)數(shù)字的值是否大于等于指定的最小值
@Pattern用于校驗(yàn)字符串的值是否匹配指定的正則表達(dá)式
@Email用于校驗(yàn)字符串的值是否符合Email格式
@DecimalMin用于校驗(yàn)數(shù)字的值是否大于等于指定的最小值,可以指定最小值的精度

Hibernate Validator 提供了一些拓展注解,用于在 validation-api 注解基礎(chǔ)上實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)校驗(yàn)。

以下是一些常見的 Hibernate Validator 拓展注解(部分)

@URL用于校驗(yàn)字符串的值是否符合 URL 地址格式
@CreditCardNumber用于校驗(yàn)信用卡號(hào)的格式是否正確
@Currency用于校驗(yàn)貨幣代碼是否正確
@ISBN用于校驗(yàn)國(guó)際標(biāo)準(zhǔn)書號(hào)(ISBN)是否正確
@Range用于校驗(yàn)數(shù)字的值是否在指定范圍內(nèi)

1.3.代碼示例

對(duì)于一個(gè)請(qǐng)求參數(shù),根據(jù)需求進(jìn)行注解申明

import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;

@Data
public class ReqCreateCatalog {

    @NotEmpty
    private String gameId;

    @DecimalMin(value = "1")
    @DecimalMax(value = "2")
    private int type;

    //目標(biāo)目錄
    @Size(max = 50, message = "名稱長(zhǎng)度不能超過{max}個(gè)字符")
    private String catalog;
}

controller方法參數(shù)增加@Valid注解

@PostMapping(value = "/createCatalog")
public Response create(@Valid @RequestBody ReqCreateCatalog req) {

}

如果請(qǐng)求故意把gameId參數(shù)設(shè)為空,

則程序輸出異常日志

2. 全局異常處理器

2.1.使用@RestControllerAdvice攔截異常

上面的例子可以看出,當(dāng)驗(yàn)證器拋出MethodArgumentNotValidException異常,如果沒有一個(gè)全局異常捕獲器對(duì)其進(jìn)行捕獲并進(jìn)行轉(zhuǎn)義,前端得到的響應(yīng)很奇怪。

SpringMVC使用@RestControllerAdvice注解對(duì)全局異常進(jìn)行攔截,例如下面的代碼

(也可以使用@ControllerAdvice注解,但每個(gè)方法還需要添加@ResponseBody注解)

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Response<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("請(qǐng)求地址'{}',參數(shù)校驗(yàn)失敗'{}'", requestURI, e.getMessage());
        return Response.fail(I18nConstants.COMMON_ILLEGAL_PARAMS);
    }

    @ExceptionHandler(BusinessRequestException.class)
    public Response<Object> handleBusinessRequestException(BusinessRequestException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("請(qǐng)求地址'{}',權(quán)限碼校驗(yàn)失敗'{}'", requestURI, e.getMessage());
        return Response.fail(e.getErrorCode());
    }

    @ExceptionHandler(value = Exception.class)
    public Response<Object> handleException(Exception e, HttpServletRequest request) {
        LoggerUtil.error("", e);
        return Response.fail(I18nConstants.COMMON_INTERNAL_ERROR);
    }

}

2.2.異常攔截方法有以下幾個(gè)注意地方

  • 方法名必須以handle開頭;
  • 需要添加@ExceptionHandler注解,注解的值是一個(gè)異常類數(shù)組,當(dāng)value為空,則默認(rèn)取方法的異常參數(shù)類型;
  • 當(dāng)程序觸發(fā)了一個(gè)異常,如果在全局異常攔截器找不到映射,則會(huì)遞歸找它的父異常,則到父類Throwalbe為止;
  • 如果多個(gè)@RestControllerAdvice示例綁定了同一個(gè)異常,程序不會(huì)報(bào)錯(cuò),但只有一個(gè)攔截器起作用。

2.3.使用案例

使用全局異常攔截器,重新發(fā)起請(qǐng)求,可以看到客戶端輸出:

{
  "success": false,
  "message": 1003, //I18nConstants.COMMON_ILLEGAL_PARAMS
  "data": null
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring boot基于Java的容器配置講解

    spring boot基于Java的容器配置講解

    這篇文章主要介紹了spring boot基于Java的容器配置講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Mybatis數(shù)據(jù)批量插入如何實(shí)現(xiàn)

    Mybatis數(shù)據(jù)批量插入如何實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis數(shù)據(jù)批量插入如何實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JAVA實(shí)現(xiàn)生成順序ID,不浪費(fèi)ID

    JAVA實(shí)現(xiàn)生成順序ID,不浪費(fèi)ID

    這篇文章主要介紹了JAVA實(shí)現(xiàn)生成順序ID,不浪費(fèi)ID問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java中小球碰撞并使用按鈕控制數(shù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Java結(jié)合redistemplate使用分布式鎖案例講解

    Java結(jié)合redistemplate使用分布式鎖案例講解

    在Java中使用RedisTemplate結(jié)合Redis來實(shí)現(xiàn)分布式鎖是一種常見的做法,特別適用于微服務(wù)架構(gòu)或多實(shí)例部署的應(yīng)用程序中,以確保數(shù)據(jù)的一致性和避免競(jìng)態(tài)條件,下面給大家分享使用Spring Boot和RedisTemplate實(shí)現(xiàn)分布式鎖的案例,感興趣的朋友一起看看吧
    2024-08-08
  • Java中圖像銳化操作的方法詳解

    Java中圖像銳化操作的方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中圖像銳化操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 如何在Intellij中安裝LeetCode刷題插件方便Java刷題

    如何在Intellij中安裝LeetCode刷題插件方便Java刷題

    這篇文章主要介紹了如何在Intellij中安裝LeetCode刷題插件方便Java刷題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 解決mybatis 執(zhí)行mapper的方法時(shí)報(bào)空指針問題

    解決mybatis 執(zhí)行mapper的方法時(shí)報(bào)空指針問題

    這篇文章主要介紹了解決mybatis 執(zhí)行mapper的方法時(shí)報(bào)空指針問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中的序列化解析

    java中的序列化解析

    這篇文章主要介紹了java中的序列化解析,為了將對(duì)象進(jìn)行網(wǎng)絡(luò)傳輸或者是持久化,我們需要將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或者傳輸?shù)男问?這個(gè)轉(zhuǎn)換的過程就叫序列化,需要的朋友可以參考下
    2023-09-09
  • SpringBoot如何通過yml方式整合Mybatis

    SpringBoot如何通過yml方式整合Mybatis

    這篇文章主要介紹了SpringBoot如何通過yml方式整合Mybatis,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論