你還在用if做條件驗證嗎?
請先看看下面代碼:(簡單舉個例子,代碼并不規(guī)范)
@ApiOperation("新增用戶")
@PostMapping("/addUser")
public ResultVo insert(@ApiParam("用戶信息實體") @RequestBody User user){
if(user.getUserName!=null){
throw new BusinessException("用戶名稱不能為空");
}
if(user.getUserPhone!=null){
throw new BusinessException("用戶電話不能為空");
}
if( user.getUserPhone().length()){
throw new BusinessException("用戶電話格式不規(guī)范");
}
return new ResultVo(userService.insert(user));
}
以上代碼主要是為了對用戶user實體進行條件驗證。
但是那么多的if, 寫得純純得小白一個,也使得代碼顯得臃腫不美觀不優(yōu)雅!
接下來,讓我們學習使用優(yōu)雅的參數(shù)驗證@Validated!
一、優(yōu)雅的參數(shù)驗證@Validated
@Valid和@Validated是Spring Validation框架提供的參數(shù)驗證功能。
1.@Valid和@Validated的用法(區(qū)別)
二者主要作用在于 都作為標準JSR-303規(guī)范,在檢驗Controller的入?yún)⑹欠穹弦?guī)范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區(qū)別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
@Valid:
@Valid注解用于校驗,所屬包為:javax.validation.Valid。
用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能。**能夠用在成員屬性(字段)**上,提示驗證框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
@Validated:
@Validated是@Valid 的一次封裝,是Spring提供的校驗機制使用。
用在方法入?yún)⑸蠠o法單獨提供嵌套驗證功能。不能用在成員屬性(字段)上,也無法提示框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
2.引入并使用@Validated參數(shù)驗證
- 引入校驗的依賴包
<!--第一種方式導入校驗依賴:使用springboot時,在org\springframework\spring-context\5.2.1.RELEASE\spring-context-5.2.1.RELEASE.jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--第二種方式導入校驗依賴-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--第三種方式導入校驗依賴-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
- 找到自己的實體類定義自己要校驗的參數(shù)
3.在controller的入?yún)⑻幪砑覢Validated注解(@Validated可以指定groups區(qū)別驗證,@Valid不可以指定groups,見上面二者區(qū)別)
@Validated(addGroup.class)就是給參數(shù)進行了分組校驗
@ApiOperation("新增用戶")
@PostMapping("/addUser")
public ResultVo insert(@ApiParam("用戶信息實體") @Validated(addUser.class) @RequestBody User user){
return new ResultVo(userService.insert(user));
}
那么addGroup.class是哪里來的??什么作用?
addGroup.class:是一個接口類,簡單的來說:就是用來給參數(shù)做標記的(里面不需要寫任何代碼)
到這里基本的使用就結束了!
二、javax.validation.constraints下參數(shù)條件注解詳解
實現(xiàn)參數(shù)驗證功能,我們需要@Validated注解配合 在實體類的的參數(shù)加上條件驗證注解(設置具體的條件限制規(guī)則)一起實現(xiàn)參數(shù)驗證功能。
而這些參數(shù)條件注解是由javax.validation.constraints包下提供,主要如下:
-
@NotNull :被注解的元素必須不為null
-
@NotBlank注解 :驗證注解的元素值不為空(不為null、去除首位空格后長度為0) ,并且類型為String。
-
@NotEmpty注解 :驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) ,并且類型為String。
-
@AssertTrue注解 :被注解的元素必須為true,并且類型為boolean。
-
@AssertFalse注解 :被注解的元素必須為false,并且類型為boolean。
-
@Min注解 :被注解的元素其值必須大于等于最小值,并且類型為int,long,float,double。
-
@Max注解:被注解的元素其值必須小于等于最小值,并且類型為int,long,float,double。
-
@DecimalMin注解 :驗證注解的元素值大于等于@DecimalMin指定的value值,并且類型為BigDecimal。
-
@DecimalMax注解 :驗證注解的元素值小于等于@DecimalMax指定的value值 ,并且類型為BigDecimal。
-
@Range注解 :驗證注解的元素值在最小值和最大值之間,并且類型為BigDecimal,BigInteger,CharSequence,byte,short,int,long。
-
@Past注解 :被注解的元素必須為過去的一個時間,并且類型為java.util.Date。
-
@Future注解 :被注解的元素必須為未來的一個時間,并且類型為java.util.Date。
-
@Size注解 :被注解的元素的長度必須在指定范圍內,并且類型為String,Array,List,Map。
-
@Length注解 :驗證注解的元素值長度在min和max區(qū)間內 ,并且類型為String。
-
@Digits注解 :驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限 ,并且類型為float,double,BigDecimal。
-
@Pattern注解 :被注解的元素必須符合指定的正則表達式,并且類型為String。
-
@Email注解: 驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式,類型為String。
三、自定義條件注解
如果在寫項目的過程中,參數(shù)需要的條件注解滿足不上,則我們需要自定義注解來完成
步驟:
1.創(chuàng)建一個自定義的注解類
/**自定義條件注解
* @author: wxh
* @version:v1.0
* @date: 2022/11/14 22:39
*/
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
public @interface ListValue {
//配置路徑,后端傳遞信息
String message() default "{com.itfuture.e.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
//自定義一個類型來存放數(shù)據(jù)(數(shù)組)
int[] values() default {};
}
2.創(chuàng)建一個邏輯處理數(shù)據(jù)的方法
/**自定義顯示狀態(tài)
* @author: wxh
* @version:v1.0
* @date: 2022/11/14 22:49
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
//set存儲
private Set<Integer> set = new HashSet<>();
//初始化數(shù)據(jù)
//listValue拿到的是注解中的數(shù)據(jù)
@Override
public void initialize(ListValue constraintAnnotation) {
//拿到注解中自定義的數(shù)據(jù),且是數(shù)組型的
int[] values = constraintAnnotation.values();
//放在數(shù)組里,遍歷判斷
for(int value:values){
set.add(value);
}
}
//判斷數(shù)據(jù)是否相同
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
if(set.contains(integer)){
return true;
}
return false;
}
}
3.String message() default “{com.atguigu.common.valid.ListValue.message}”;
這個消息:message() default "{com.atguigu.common.valid.ListValue.message}"也可以通過配置文件去配置:
4.在實體類的參數(shù)條件中來調用:
文章來源:http://www.zghlxwxcb.cn/news/detail-784137.html
至此,參數(shù)驗證基本完述!文章來源地址http://www.zghlxwxcb.cn/news/detail-784137.html
到了這里,關于【優(yōu)雅的參數(shù)驗證@Validated】@Validated參數(shù)校驗的使用及注解詳解——你還在用if做條件驗證?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!