欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用

 更新時(shí)間:2020年09月02日 10:43:21   作者:詩水人間  
這篇文章主要介紹了JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引入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)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評論