亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringMVC使用hibernate-validator進行參數(shù)校驗最佳實踐記錄

 更新時間:2021年05月12日 10:32:57   作者:kusedexingfu  
這篇文章主要介紹了SpringMVC使用hibernate-validator進行參數(shù)校驗最佳實踐,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在我們用Controller接收參數(shù)后,往往需要對參數(shù)進行校驗。如果我們手寫校驗的話,就會有一堆的判空代碼,看起來很不優(yōu)雅,寫起來也費時費力。下面來看下通過hibernate-validator來進行優(yōu)雅的參數(shù)校驗。

首先需要引入依賴:

<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>6.2.0.Final</version>
</dependency>

hibernate-validator注解

hibernate-validator提供了很多注解來讓我們進行參數(shù)校驗:

常用的校驗注解如下表所示:

注解 說明
@Null 被注釋的元素必須為null
@AssertTrue 被注釋的元素必須為true
@AssertFalse 被注釋的元素必須為false
@DecimalMin(value=,message=) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value=,message=) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Digits (integer, fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)
@Past 被注釋的元素必須是一個過去的日期
@Future 被注釋的元素必須是一個將來的日期
@Email 被注釋的元素必須是電子郵箱地址

主要區(qū)分下@NotNull、@NotEmpty、@NotBlank 3個注解的區(qū)別:
(1)@NotNull:任何對象的value不能為null。
(2)@NotEmpty:集合對象的元素不為0,即集合不為空,也可以用于字符串不為null。
(3)@NotBlank:只能用于字符串不為null,并且字符串trim()以后length要大于0。

需要注意如下幾點:
(1)除了@Empty要求字符串不能全是空格,其他的字符串校驗都是允許空格的。
(2)message是可以引用常量的,但是如@Size里max不允許引用對象常量,基本類型常量是可以的。message是錯誤提示信息,是可以返回給前臺的。
(3)大部分規(guī)則校驗都是允許參數(shù)為null,即當(dāng)不存在這個值時,就不進行校驗了。


不太常用的校驗注解如下表所示:

注解 說明
@Null 被注釋的元素必須為null
@AssertTrue 被注釋的元素必須為true
@AssertFalse 被注釋的元素必須為false
@DecimalMin(value=,message=) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value=,message=) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Digits (integer, fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)
@Past 被注釋的元素必須是一個過去的日期
@Future 被注釋的元素必須是一個將來的日期
@Email 被注釋的元素必須是電子郵箱地址

代碼實戰(zhàn)

1.、使用BindingResult獲取檢驗結(jié)果

我們可以使用BindingResult獲取檢驗結(jié)果,構(gòu)造友好的返回信息

Controller中的代碼如下:

@Api(tags = "校驗框架")
@RestController
@RequestMapping("/validate")
public class ValidatedController {
 
 
    @ApiOperation(value = "bindValidate")
    @PostMapping("bindValidate")
    public ValidatedVO bindValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO, BindingResult result) {
        if (result.hasErrors()) {
            StringBuilder message = new StringBuilder("參數(shù)校驗失敗:");
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                message.append(error.getDefaultMessage()).append(".");
            }
            throw HttpError.error(111, message.toString());
        }
        return validatedVO;
    }
 
 
}

我們用以下實體類來作為Controller的參數(shù)接收實體

import lombok.Data;
 
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
 
@Data
public class ValidatedVO {
 
    //更新、刪除時不能為空
    @NotNull(message = "id不能為空", groups = {ValidatedGroup.UPDATE.class, ValidatedGroup.DELET.class})
    private Long id;
 
    //新增、更新時不能為空
    @NotBlank(message = "name不能為空", groups = {ValidatedGroup.CREATE.class ,ValidatedGroup.UPDATE.class})
    private String name;
 
    //查詢時不能為空
    @NotBlank(message = "queryParam不能為空", groups = {ValidatedGroup.QUERY.class})
    private String queryParam;
 
}

分組的類:

public class ValidatedGroup {
 
    public interface CREATE{}
 
    public interface DELET{}
 
    public interface UPDATE{}
 
    public interface QUERY{}
}

需要注意的是,@Validated支持分組校驗,即校驗注解中的groups屬性。這個為我們的校驗也提供了便利。我們可以在Controller需要校驗的參數(shù)前用@Validated的value屬性來表示需要校驗的分組,那么就會只會校驗實體對象中擁有相同的分組的屬性。這樣我們就可以只用一個實體滿足不同的場景了。

啟動項目后,我們在swagger上請求,傳遞空的json字符串【{}】,返回結(jié)果:

{
  "code": 111,
  "message": "參數(shù)校驗失敗:id不能為空."
}

 然而每次都需要在請求進來時用BindingResult做處理,很不優(yōu)雅。

2.通過@RestControllerAdvice統(tǒng)一處理參數(shù)校驗信息

如果我們不用BindingResult獲取校驗結(jié)果,即不做處理,框架就會拋出異常,響應(yīng)400碼,返回一些不友好的錯誤信息。即用如下代碼:

@ApiOperation(value = "bindValidate")
    @PostMapping("bindValidate")
    public ValidatedVO bindValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO/*, BindingResult result*/) {
        /*if (result.hasErrors()) {
            StringBuilder message = new StringBuilder("參數(shù)校驗失敗:");
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                message.append(error.getDefaultMessage()).append(".");
            }
            throw HttpError.error(111, message.toString());
        }*/
        return validatedVO;
    }

那么我們就可以使用@RestControllerAdvice來對異常進行處理,進行友好信息的提示

如果對@RestControllerAdvice和@ControllerAdvice不了解的,可以去查詢學(xué)習(xí),這里不進行講述

@RestControllerAdvice
public class GlobalExceptionHandler {    
 
    @ExceptionHandler(Exception.class)
    public CommonErrorVO handle(Exception e){
        if (e instanceof HttpError) {
            HttpError error = (HttpError)e;
            return CommonErrorVO.builder().code(error.getCode()).message(error.getMessage()).build();
        } else if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;
            StringBuilder message = new StringBuilder("");
            validException.getBindingResult().getAllErrors().forEach(err -> {
                message.append(err.getDefaultMessage()).append(".");
            });
            return CommonErrorVO.builder().code(888).message(message.toString()).build();
        } else {
            return CommonErrorVO.builder().code(999).message(e.getMessage()).build();
        }
    }    
}

MethodArgumentNotValidException異常即為hibernate-validator校驗不通過拋出的異常信息,我們從其中獲取到校驗失敗的信息來進行組裝。

如上,我們通過@Validated配合@RestControllerAdvice完成了優(yōu)雅的參數(shù)校驗。

為了體現(xiàn)分組校驗的便利性,我做了如下的測試,如果每個請求參數(shù)都是空的json字符串【{}】的話,那么返回的信息如下。

@Api(tags = "校驗框架")
@RestController
@RequestMapping("/validate")
public class ValidatedController {
 
    /**
     * @Validated注解表示開啟Spring的校驗機制,支持分組校驗,聲明在入?yún)⑸稀?
     * @param validatedVO
     * @return
     */
    @ApiOperation(value = "分組校驗:QUERY參數(shù)校驗")//返回 【queryParam不能為空】
    @PostMapping("queryValidate")
    public ValidatedVO queryValidate(@RequestBody @Validated(value= {ValidatedGroup.QUERY.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分組校驗:CREATE參數(shù)校驗")// 返回 【name不能為空】
    @PostMapping("createValidate")
    public ValidatedVO createValidate(@RequestBody @Validated(value= {ValidatedGroup.CREATE.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分組校驗:UPDATE參數(shù)校驗") // 返回【id不能為空.name不能為空.】
    @PostMapping("updateValidate")
    public ValidatedVO updateValidate(@RequestBody @Validated(value= {ValidatedGroup.UPDATE.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分組校驗:DELETE參數(shù)校驗") //返回 【id不能為空】
    @PostMapping("deleteValidate")
    public ValidatedVO deleteValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
}

到此這篇關(guān)于SpringMVC使用hibernate-validator進行參數(shù)校驗最佳實踐記錄的文章就介紹到這了,更多相關(guān)SpringMVC參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot快速通關(guān)自動配置應(yīng)用

    SpringBoot快速通關(guān)自動配置應(yīng)用

    在進行項目編寫前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做了哪些配置,包括如何擴展,如何定制,只有把這些都搞清楚了,我們在之后使用才會更加得心應(yīng)手
    2022-07-07
  • java中CompletableFuture異步執(zhí)行方法

    java中CompletableFuture異步執(zhí)行方法

    本文主要介紹了java中CompletableFuture異步執(zhí)行方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • LinkedList學(xué)習(xí)示例模擬堆棧與隊列數(shù)據(jù)結(jié)構(gòu)

    LinkedList學(xué)習(xí)示例模擬堆棧與隊列數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了LinkedList學(xué)習(xí)示例,模擬一個堆棧與隊列數(shù)據(jù)結(jié)構(gòu),大家參考使用吧
    2014-01-01
  • 如何用nacos搭建微服務(wù)注冊配置中心

    如何用nacos搭建微服務(wù)注冊配置中心

    這篇文章主要介紹了如何用nacos搭建微服務(wù)注冊配置中心問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 深入淺析Java中的volatile

    深入淺析Java中的volatile

    volatile是Java提供的一種輕量級的同步機制,在并發(fā)編程中,它也扮演著比較重要的角色.這篇文章主要介紹了深入淺析Java中的volatile,需要的朋友可以參考下
    2017-03-03
  • Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 為我們提供了優(yōu)雅退出的功能,使應(yīng)用程序能夠在關(guān)閉時正常處理完所有當(dāng)前請求,避免請求被中斷導(dǎo)致數(shù)據(jù)丟失或不一致等問題,本文將全面介紹如何在 Spring Boot 應(yīng)用程序中實現(xiàn)優(yōu)雅退出,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Spring Security實現(xiàn)登錄認證實戰(zhàn)教程

    Spring Security實現(xiàn)登錄認證實戰(zhàn)教程

    這篇文章主要介紹了Spring Security實現(xiàn)登錄認證實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-06-06
  • Java設(shè)計模式中的建造者模式詳解

    Java設(shè)計模式中的建造者模式詳解

    這篇文章主要介紹了Java設(shè)計模式中的建造者模式詳解,建造者模式使我們?nèi)粘9ぷ髦斜容^常見的一種設(shè)計模式,和工廠模式一樣屬于創(chuàng)建型設(shè)計模式,用于解耦對象創(chuàng)建和對象使用的邏輯,需要的朋友可以參考下
    2023-12-12
  • Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper用于映射SQL語句,可以說是MyBatis操作數(shù)據(jù)庫的核心特性之一,這里我們來討論Java的MyBatis框架中Mapper映射配置的使用及原理解析,包括對mapper的xml配置文件的讀取流程解讀.
    2016-06-06
  • eclipse/intellij idea 查看java源碼和注釋方法

    eclipse/intellij idea 查看java源碼和注釋方法

    下面小編就為大家?guī)硪黄猠clipse/intellij idea 查看java源碼和注釋方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論