国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

SpringMVC使用hibernate-validator進(jìn)行參數校驗最佳實(shí)踐

發(fā)布時(shí)間:2021-07-06 11:13 來(lái)源:腳本之家 閱讀:0 作者:kusedexingfu 欄目: 開(kāi)發(fā)技術(shù)

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

首先需要引入依賴(lài):

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

hibernate-validator注解

hibernate-validator提供了很多注解來(lái)讓我們進(jìn)行參數校驗:

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

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

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


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

代碼實(shí)戰

1.、使用BindingResult獲取檢驗結果

我們可以使用BindingResult獲取檢驗結果,構造友好的返回信息

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("參數校驗失?。?);
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                message.append(error.getDefaultMessage()).append(".");
            }
            throw HttpError.error(111, message.toString());
        }
        return validatedVO;
    }
 
 
}

我們用以下實(shí)體類(lèi)來(lái)作為Controller的參數接收實(shí)體

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

分組的類(lèi):

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

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

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

{
  "code": 111,
  "message": "參數校驗失?。篿d不能為空."
}

 然而每次都需要在請求進(jìn)來(lái)時(shí)用BindingResult做處理,很不優(yōu)雅。

2.通過(guò)@RestControllerAdvice統一處理參數校驗信息

如果我們不用BindingResult獲取校驗結果,即不做處理,框架就會(huì )拋出異常,響應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("參數校驗失?。?);
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                message.append(error.getDefaultMessage()).append(".");
            }
            throw HttpError.error(111, message.toString());
        }*/
        return validatedVO;
    }

那么我們就可以使用@RestControllerAdvice來(lái)對異常進(jìn)行處理,進(jìn)行友好信息的提示

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

@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校驗不通過(guò)拋出的異常信息,我們從其中獲取到校驗失敗的信息來(lái)進(jìn)行組裝。

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

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

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

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

日本肥老太肥506070| 男女激情爽爽爽免费视频| 久久综合九色综合欧洲98| А天堂中文地址在线| 国产粉嫩高中无套进入| 国产成人AV片免费|