JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用
引入validation依賴
<!--JSR303依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Null檢查
@Null(message = "") 驗(yàn)證對象是否為null
@NotNull(message = "") 驗(yàn)證對象是否不為null, 無法查檢長度為0的字符串
@NotBlank(message = "") 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.
@NotEmpty(message = "") 檢查約束元素是否為NULL或者是EMPTY.
Booelan檢查
@AssertTrue(message = "") 驗(yàn)證 Boolean 對象是否為 true
@AssertFalse(message = "") 驗(yàn)證 Boolean 對象是否為 false
長度檢查
@Size(min=, max=,message = "") 驗(yàn)證對象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi)
@Length(min=, max=,message = "") Validates that the annotated string is between min and max included.
日期檢查
@Past(message = "") 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時(shí)間之前
@Future(message = "") 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時(shí)間之后
@Pattern(regexp = "",message = "") 驗(yàn)證 String 對象是否符合正則表達(dá)式的規(guī)則
數(shù)值檢查
建議使用在包裝類型(Integer這類),不建議使用在int類型上,
因?yàn)楸韱沃禐椤啊睍r(shí)無法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min(message = "") 驗(yàn)證 Number 和 String 對象是否大等于指定的值
@Max(message = "") 驗(yàn)證 Number 和 String 對象是否小等于指定的值
@DecimalMax(message = "") 值不大于約束中指定的最大值. 這個約束的參數(shù)是一個通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin(message = "") 值必須不小于約束中指定的最小值. 這個約束的參數(shù)是一個通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
@Digits(message = "") 驗(yàn)證 Number 和 String 的構(gòu)成是否合法
@Digits(integer=,fraction=,message = "") 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。
@Range(min=, max=,message = "") 檢查數(shù)字是否介于min和max之間.
@Valid 遞歸的對關(guān)聯(lián)對象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗(yàn),如果是一個map,則對其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)
@CreditCardNumber(message = "") 信用卡驗(yàn)證
@Email(message = "") 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過驗(yàn)證。
@ScriptAssert(lang= ,script=, alias=,message = "")
@URL(protocol=,host=, port=,regexp=, flags=,message = "")
每一個校驗(yàn)注解都有一個message用來定義錯誤信息的返回信息,也有一個groups用來定義不同情形寫生效的注解,需要傳入一個接口類型的類用來定義。
在進(jìn)行分組校驗(yàn)的情況下,沒有攜帶groups的校驗(yàn)注解不生效,不是一組的也不會生效,使用方式先在要校驗(yàn)的字段標(biāo)記注解并且填入groups=接口名.class需要編寫一個空接口用來標(biāo)記分組
不分組校驗(yàn)的情況下不標(biāo)記groups的注解也會生效
在springboot中使用@Validated(value = {接口名.class})來指定那個groups生效
自定義校驗(yàn)可以使用@Pattern 輸入正則表達(dá)式,會根據(jù)正則校驗(yàn)
在實(shí)體中添加校驗(yàn)注解
前端將數(shù)據(jù)提交給后端的controller、controller通過映射將數(shù)據(jù)映射到實(shí)體,在映射的時(shí)候會進(jìn)行校驗(yàn),如果校驗(yàn)不通過會通過message填入的信息將錯誤信息返回給controller中對于的方法
在實(shí)體層添加注解,其中message是返回的消息
public class Person { @NotEmpty(message="姓名不能為空") private String name; private int userId; @Length(min=6,max=10,message="密碼必須在6-10位之間") private String password; @Email(message="郵箱不符合格式") private String email; }
開啟校驗(yàn)
在入請求體參數(shù)加上@Valid注解
在springboot中使用@Validated注解,是JSR303規(guī)范中springboot的實(shí)現(xiàn)
@PostMapping("/person") public Object addPerson(@RequestBody @Valid Person person, BindingResult result) { if (result.hasErrors()) { // 判斷異常,將異常返回 List<ObjectError> allErrors = result.getAllErrors(); //獲取所有的異常信息 for (ObjectError error : allErrors) { System.out.println(error.getCode() + "\t" + error.getDefaultMessage()); } } return person; }
集中處理異常示例代碼
import com.atguigu.common.exception.BizCodeEnume; import com.atguigu.common.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; /** * 集中處理所有異常 */ @Slf4j @RestControllerAdvice(basePackages = "拋異常的類全路徑") public class GulimallExceptionControllerAdvice { @ExceptionHandler(value= MethodArgumentNotValidException.class) public R handleVaildException(MethodArgumentNotValidException e){ log.error("數(shù)據(jù)校驗(yàn)出現(xiàn)問題{},異常類型:{}",e.getMessage(),e.getClass()); BindingResult bindingResult = e.getBindingResult(); Map<String,String> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((fieldError)->{ errorMap.put(fieldError.getField(),fieldError.getDefaultMessage()); }); return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap); } @ExceptionHandler(value = Throwable.class) public R handleException(Throwable throwable){ log.error("錯誤:",throwable); return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg()); } }
自定義校驗(yàn)注解
自定義校驗(yàn)注解必須要有三個內(nèi)容values,message,groups
也就是必須要喲下面的3行代碼
String message() default "{com.atguigu.common.valid.ListValue.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { };
message中{com.atguigu.common.valid.ListValue.message}是默認(rèn)的返回錯誤信息
因此需要創(chuàng)建對應(yīng)的properties/yml文件,并且在其中定義錯誤信息的值
例如 com.atguigu.common.valid.ListValue.message=必須提交指定的值!
同時(shí)需要下面這些注解@Target指定注解在那些地方生效,METHOD表示方法、FIELD表示字段其他的類推
@Constraint用來指定自定義校驗(yàn)的校驗(yàn)器,validatedBy = { ListValueConstraintValidator.class }表示指定ListValueConstraintValidator.class作為校驗(yàn)器,可以有多個
@Documented @Constraint(validatedBy = { ListValueConstraintValidator.class }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME)
如果找不到類則添加依賴
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>
完整的自定義校驗(yàn)注解的案例
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented @Constraint(validatedBy = { ListValueConstraintValidator.class }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) public @interface ListValue { String message() default "{com.atguigu.common.valid.ListValue.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] vals() default { }; }
使用案例
groups指定分組生效
@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class}) private Integer showStatus;
要使校驗(yàn)注解生效,需要有一個自定義的校驗(yàn)注解器,實(shí)現(xiàn)ConstraintValidator接口需要有兩個泛型
第一個是注解類,另一個是校驗(yàn)值的類型
例如
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; import java.util.Set; public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> { private Set<Integer> set = new HashSet<>(); //初始化方法 @Override public void initialize(ListValue constraintAnnotation) { int[] vals = constraintAnnotation.vals(); for (int val : vals) { set.add(val); } } //判斷是否校驗(yàn)成功 /** * * @param value 需要校驗(yàn)的值 * @param context * @return */ @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return set.contains(value); } }
進(jìn)行校驗(yàn)的類,其中BrandEntity 中有上面的showStatus字段并且有對應(yīng)的自定義校驗(yàn)注解
@RequestMapping("/update") public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){ /*業(yè)務(wù)代碼*/ return R.ok(); }
到此這篇關(guān)于JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用的文章就介紹到這了,更多相關(guān)JSR303校驗(yàn)注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java如何使用JSR303校驗(yàn)數(shù)據(jù)與自定義校驗(yàn)注解
- springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法
- springboot接口參數(shù)校驗(yàn)JSR303的實(shí)現(xiàn)
- SpringBoot后端進(jìn)行數(shù)據(jù)校驗(yàn)JSR303的使用詳解
- Spring中使用JSR303請求約束判空的實(shí)現(xiàn)
- SpringBoot使用jsr303校驗(yàn)的實(shí)現(xiàn)
- SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼
- Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的方法實(shí)例
- Springboot集成JSR303參數(shù)校驗(yàn)的方法實(shí)現(xiàn)
- Java中JSR303的基本使用詳情
相關(guān)文章
mybatis-plus攔截器、字段填充器、類型處理器、表名替換、SqlInjector(聯(lián)合主鍵處理)
本文主要介紹了mybatis-plus攔截器、字段填充器、類型處理器、表名替換、SqlInjector(聯(lián)合主鍵處理),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11解析Linux系統(tǒng)中JVM內(nèi)存2GB上限的詳解
本篇文章是對Linux系統(tǒng)中JVM內(nèi)存2GB上限進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05java實(shí)現(xiàn)字符串like和not?like的使用示例
在Java中,我們經(jīng)常需要對字符串進(jìn)行模式匹配操作,字符串的模式匹配通常使用like和not?like這兩個運(yùn)算符進(jìn)行,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-09-09Java如何使用正則表達(dá)式從字符串中提取數(shù)字
這篇文章主要介紹了Java如何使用正則表達(dá)式從字符串中提取數(shù)字問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
在 SpringBoot項(xiàng)目開發(fā)中,有一個觀點(diǎn)是不要相信前端傳入的參數(shù),因?yàn)槟悴恢烙脩羰窃趺床僮魑覀兘涌诘?,所以在后端也需要對參?shù)進(jìn)行校驗(yàn),這篇文章主要講講我們項(xiàng)目中最常使用的驗(yàn)證方案2023-05-05Mybatis-Plus3.x的創(chuàng)建步驟及使用教程
MyBatis-Plus是一個?MyBatis?的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為?簡化開發(fā)、提高效率而生,這篇文章主要介紹了Mybatis-Plus3.x的使用,需要的朋友可以參考下2023-10-10Spring AOP 實(shí)現(xiàn)自定義注解的示例
這篇文章主要介紹了Spring AOP 實(shí)現(xiàn)自定義注解的示例,幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下2021-03-03