SpringBoot整合Validation進行參數校驗

目錄
依賴
在controller中校驗接收到的參數
Validation常用註解
異常處理
多級嵌套校驗
分組校驗


spring、lombok提供了一些參數校驗的註解,比如@Nullable、@NonNull ,但比較雞肋,常用Validation的註解來校驗controller接收到的參數。

以springboot整合validation爲例。

 

依賴
創建時勾選 I/O -> Validation,也可以手動添加依賴

<!-- 這個依賴主要包含了 hibernate-validator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1
2
3
4
5

實質是使用hibernate的遺產 hibernate-validator,也可以直接引入下面的依賴

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.2.Final</version>
</dependency>
1
2
3
4
5

在controller中校驗接收到的參數
@Controller
@Validated //類上加spring的註解 @Validated
public class TestController {

@RequestMapping("/handler1")
@ResponseBody
// 如果要校驗的參數是jdk自帶的類型(包括數組、集合),可直接在參數前加註解
public User handler1(@NotNull String name, String tel, @Email String email, @NotEmpty String[] hoby) {
return new User(1, name, tel, email, hoby);
}

@RequestMapping("/handler2")
@ResponseBody
// 如果要校驗的參數是實體類,在實體類參數前加@Validated,校驗的註解加在實體類的成員變量上
public User handler2(@Validated User user) {
return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Getter
@Setter
@ToString
@AllArgsConstructor
public class User implements Serializable {

private Integer id;

@NotNull
private String name;

private String tel;

@Email
private String email;

@NotEmpty
private String[] hoby;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Validation常用註解
@NotNull //常用於校驗包裝類型、數組,不能爲null
@NotEmpty //校驗包裝類型、String、數組、集合,不能爲null。如果是集合、數組,裏面要有元素;如果是字符串,不能爲空串,但可以是空格串
@NotBlank //校驗String,不能爲null,且不能爲空串、空格串

//如果是String,不管前端有沒有傳該字段、該字段是否有值,後端該字段一定不爲null,要用@NotEmpty|@NotBlank不能用@NotNull
//如果是數組(複選框),後端會先檢驗數組中是否有元素,有才new一個數組來接收,可以用@NotNull來校驗
//總結:包裝類用NotNull,String用@NotEmpty|@NotBlank,數組用@NotNull|@NotEmpty


@Max(100) //校驗數值型,參數指定允許的最大值(long型),value=100,此處簡寫了
@Min(1)
@Range(min = 1, max = 100) //校驗數值型的範圍,相當於@Min+@Max


@DecimalMax(@DecimalMax(value = "100.00", inclusive = false) //校驗定點型,可指定String類型的最大值,是否包含該值(默認true)
@DecimalMin("0.0")


@Digits(integer = 4, fraction = 2) //校驗數值型,限定整數部分最多4位,小數部分最多2位


@Future //校驗Date,必須大於當前時間,即必須是未來
@Past


@Email //必須是email格式
@URL //必須是url格式


@Length(min = 5, max = 10) //校驗字符串、數組長度(leng),【5,10】
@Size(min = 5, max = 10) //校驗集合的元素個數(size),【5,10】


@Pattern(regexp = "\\d+", message = "只能輸入1個或多個阿拉伯數字") //使用指定的正則表達式進行校驗,\d+,第一個\是轉義用的
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
30
31
32
33
34
以上註解均可指定message,如果不指定會使用默認的message。建議都指定message,返回給用戶的提示更友好。

 

異常處理
不滿足校驗條件時會直接拋出 ConstraintViolationException 異常,可在全局異常處理中捕獲處理,獲取message返回給前端

/**
* 全局異常處理
*/
@ControllerAdvice
public class GlobalExceptionHandler {

//......

@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Map<String,String> handler(ConstraintViolationException e){
Map<String, String> map = new HashMap<>(4);
map.put("code", "400");
map.put("msg", e.getMessage());
return map;
}

//.......

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

多級嵌套校驗
@Controller
@Validated
public class TestController {

@RequestMapping("/handler")
@ResponseBody
//要校驗的參數是實體類
public User handler( @Validated User user) {
//.....
return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
@ToString
public class User implements Serializable {

//......

@Valid //加@Valid
private GoodsCar goodsCar;

@Valid //加@Valid
private List<Order> orderList;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如果要檢驗的參數是實體類,而這個實體類中又嵌套了實體類,如果要校驗內嵌的實體類中的成員變量,還需要在內嵌的實體類成員上加@Valid。

spring的 @Validated 不支持多級嵌套校驗,Validation的 @Valid 則支持。

 

分組校驗
多個方法都要使用某個實體類作爲參數,但對這個實體類的成員變量的校驗規則不同,這時可以使用分組校驗。

/**
* 定義一個類|接口作爲一個分組,不一定要繼承validation的Default
* 也可以直接使用已存在的類|接口作爲分組
*/
public interface OperateById {

}


public interface FindByUser extends Default {

}
1
2
3
4
5
6
7
8
9
10
11
12
@Getter
@Setter
@ToString
public class User implements Serializable {

//使用groups指定該字段所屬的分組,屬於多個組時寫成數組形式
@NotNull(groups = {OperateById.class, FindByUser.class})
private Integer id;

@NotBlank(groups = FindByUser.class)
private String name;

//如果缺省groups屬性,默認爲Default.class,屬於默認分組
@Pattern(regexp = "[0-9]{11}")
private String tel;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
@Validated
public class TestController {

@RequestMapping("/handler")
@ResponseBody
//校驗時指定所使用的校驗規則(分組),可簡寫爲 @Validated(FindByUser.class)。缺省value屬性時默認爲Default.class,使用默認分組
public User handler( @Validated(value = FindByUser.class) User user) {
//.....
return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
校驗時會使用指定分組中的校驗規則進行校驗。示例中

OperateById分組只校驗id字段是否滿足@NotNull
默認分組只校驗tel字段是否爲11位的阿拉伯數字
FindByUser分組會校驗id字段是否滿足@NotNull、name字段是否滿足@NotBlank,因爲FindByUser繼承了Default,所以也會校驗默認分組中的字段
自定義的分組要不要繼承Default,視需求而定。
————————————————
版權聲明:本文爲CSDN博主「chy1984」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chy_18883701161/article/details/109848241

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章