一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring 使用Validation 驗證框架的問題詳解

Spring 使用Validation 驗證框架的問題詳解

2021-10-29 10:57小畢超 Java教程

Spring Boot在內部通過集成hibernate-validation已經實現了JSR-349驗證規范接口,在Spring Boot項目中只要直接使用就行了。 一般用在Controller中用于驗證前端傳來的參數。這篇文章給大家介紹Spring Validation 驗證框架的相關知識,感興趣的朋友

一、介紹

Spring Validation 驗證框架對參數的驗證機制提供了@Validated (Spring's JSR-303 規范,是標準 JSR-303 的一個變種),javax 提供了@Valid(標準 JSR-303 規范),配合 BindingResult 可以直接提供參數驗證結果。其中對于字段的特定驗證注解,比如 @NotNull。
兩者在檢驗 Controller 的入參是否符合規范時,使用@Validated 或者 @Valid 在基本驗證功能上沒有太多區別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:

1.@Validated
分組:提供分組功能,可在入參驗證時,根據不同的分組采用不同的驗證機制。
可注解位置:可以用在類型、方法和方法參數上。但是不能用在成員屬性上
嵌套驗證:用在方法入參上無法單獨提供嵌套驗證功能;不能用在成員屬性上;也無法提供框架進行嵌套驗證;能配合嵌套驗證注解 @Valid 進行嵌套驗證。

2.@Valid
分組:無分組功能
可注解位置:可以用在方法、構造函數、方法參數和成員屬性上(兩者是否能用于成員屬性上直接影響能否提供嵌套驗證的功能)
嵌套驗證:用在方法入參上無法單獨提供嵌套驗證功能;能夠用在成員屬性上,提示驗證框架進行嵌套驗證;能配合嵌套驗證注解@Valid進行嵌套驗證。

二、使用

1. SpringBoot 2.3.0后需要添加依賴

?
1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 配置 validation 使出現校驗失敗即返回

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class WebConfig {
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //failFast的意思只要出現校驗失敗的情況,就立即結束校驗,不再進行后續的校驗。
                .failFast(true)
                .buildValidatorFactory();
 
        return validatorFactory.getValidator();
    }
 
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;
    }
}

4. 編寫全局異常捕獲,捕獲驗證失敗,統一返回

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {
 
    @ResponseBody
    @ExceptionHandler(BindException.class)
    public String exceptionHandler2(BindException exception) {
        BindingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "參數不可為空!";
    }
 
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String exceptionHandler2(MethodArgumentNotValidException exception) {
        BindingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "參數不可為空!";
    }
}

5. 定義Dto,在參數上添加注解校驗

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Data
public class ValidDto {
    @NotEmpty(message = "name 不可為空!")
    private String name;
 
    @NotBlank(message = "userId 不可為空!")
    private String userId;
 
    @Min(value = 1, message = "年齡有誤!")
    @Max(value = 120, message = "年齡有誤!")
    private int age;
 
    @NotBlank(message = "郵箱不可為空!")
    @Email(message = "郵箱有誤!")
    private String email;
 
    @NotBlank(message = "mobile不可為空!")
    @Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$", message = "手機號碼有誤!")
    private String mobile;
 
    @NotNull(message = "validVo 不可為空!")
    @Valid
    private ValidVo validVo;
 
    @NotEmpty(message = "list1 不可為空!")
    @Size(min = 1, max = 2, message = "list1 數據過大")
    @Valid
    private List<ValidVo> list1;
}
?
1
2
3
4
5
6
7
@Data
public class ValidVo {
    @NotBlank(message = "gender is null")
    private String gender;
    @NotBlank(message = "test is null")
    private String test;
}

6. Controller

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@RestController
@RequestMapping("/valid")
@CrossOrigin
public class ValidController {
 
    @GetMapping("/GetTest")
    public String getTest(@Valid ValidDto dto, BindingResult result) {
        if (result.hasErrors()) {
            return result.getAllErrors().get(0).getDefaultMessage();
        }
        return "success";
    }
 
    @GetMapping("/GetTest2")
    public String getTest2(@Validated ValidDto dto) {
 
        return "success";
    }
 
    @GetMapping("/GetTest3")
    public String getTest3(@Validated @RequestBody ValidDto dto) {
 
        return "success";
    }
}

到此這篇關于Spring 使用Validation 驗證框架的問題詳解的文章就介紹到這了,更多相關Spring Validation 驗證框架內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_43692950/article/details/119247774

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 男gaygays免费网站多人 | 粉嫩国产14xxxxx0000 | 风间由美被义子中文字幕 | 亚洲福利天堂网福利在线观看 | 国产成人精品免费 | 亚洲美女人黄网成人女 | 91麻豆精品国产自产在线观看 | spy2wc48美女撒尿 | 国产资源免费 | 精品久久久久久久高清 | 国产精品亚洲精品日韩已方 | 亚欧毛片基地国产毛片基地 | 成人国产在线视频在线观看 | 国产实拍会所女技师在线 | ass日本乱妇ass | 398av影院视频在线 | 古装床戏做爰无遮挡三级 | avtt在线播放 | 爽好舒服宝贝添奶吻戏 | 荡女人人爱全文免费阅读 | 美女扒开腿让男生桶爽漫画 | 婷婷日日夜夜 | 精品无人区乱码1区2区3区免费 | 成人影院www在线观看 | 好大好长好紧爽免费 | 国内精品 大秀视频 日韩精品 | 成年人免费在线看 | 大胆人gogo888体艺术在线 | 亚洲国产网址 | 色亚州| 国产精品免费观在线 | 欧美搞逼视频 | 亚洲黄色免费在线观看 | 免费人成在线观看69式小视频 | 97青草香蕉依人在线播放 | 国模一区二区三区视频一 | 成人二区 | 欧美一区二区三区成人看不卡 | 色呦阁 | 四虎影视永久在线精品免费 | 男女性gif抽搐出入视频 |