最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引入validation依賴

 <!--JSR303依賴 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
 </dependency>

Null檢查
@Null(message = "")       驗(yàn)證對(duì)象是否為null
@NotNull(message = "")    驗(yàn)證對(duì)象是否不為null, 無(wú)法查檢長(zhǎng)度為0的字符串
@NotBlank(message = "")   檢查約束字符串是不是Null還有被Trim的長(zhǎng)度是否大于0,只對(duì)字符串,且會(huì)去掉前后空格.
@NotEmpty(message = "")  檢查約束元素是否為NULL或者是EMPTY.

Booelan檢查
@AssertTrue(message = "")     驗(yàn)證 Boolean 對(duì)象是否為 true 
@AssertFalse(message = "")    驗(yàn)證 Boolean 對(duì)象是否為 false  

長(zhǎng)度檢查
@Size(min=, max=,message = "") 驗(yàn)證對(duì)象(Array,Collection,Map,String)長(zhǎng)度是否在給定的范圍之內(nèi) 
@Length(min=, max=,message = "") Validates that the annotated string is between min and max included.

日期檢查
@Past(message = "")           驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前 
@Future(message = "")      驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后 
@Pattern(regexp = "",message = "")     驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則

數(shù)值檢查

建議使用在包裝類型(Integer這類),不建議使用在int類型上,
 因?yàn)楸韱沃禐椤啊睍r(shí)無(wú)法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min(message = "")     驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值 
@Max(message = "")     驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值 
@DecimalMax(message = "") 值不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin(message = "") 值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)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  遞歸的對(duì)關(guān)聯(lián)對(duì)象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對(duì)象是個(gè)集合或者數(shù)組,那么對(duì)其中的元素進(jìn)行遞歸校驗(yàn),如果是一個(gè)map,則對(duì)其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)
@CreditCardNumber(message = "") 信用卡驗(yàn)證
@Email(message = "")  驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過(guò)驗(yàn)證。
@ScriptAssert(lang= ,script=, alias=,message = "")
@URL(protocol=,host=, port=,regexp=, flags=,message = "")

每一個(gè)校驗(yàn)注解都有一個(gè)message用來(lái)定義錯(cuò)誤信息的返回信息,也有一個(gè)groups用來(lái)定義不同情形寫生效的注解,需要傳入一個(gè)接口類型的類用來(lái)定義。

在進(jìn)行分組校驗(yàn)的情況下,沒有攜帶groups的校驗(yàn)注解不生效,不是一組的也不會(huì)生效,使用方式先在要校驗(yàn)的字段標(biāo)記注解并且填入groups=接口名.class需要編寫一個(gè)空接口用來(lái)標(biāo)記分組

不分組校驗(yàn)的情況下不標(biāo)記groups的注解也會(huì)生效

在springboot中使用@Validated(value = {接口名.class})來(lái)指定那個(gè)groups生效

自定義校驗(yàn)可以使用@Pattern 輸入正則表達(dá)式,會(huì)根據(jù)正則校驗(yàn)

在實(shí)體中添加校驗(yàn)注解

前端將數(shù)據(jù)提交給后端的controller、controller通過(guò)映射將數(shù)據(jù)映射到實(shí)體,在映射的時(shí)候會(huì)進(jìn)行校驗(yàn),如果校驗(yàn)不通過(guò)會(huì)通過(guò)message填入的信息將錯(cuò)誤信息返回給controller中對(duì)于的方法

在實(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)

在入請(qǐng)求體參數(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("錯(cuò)誤:",throwable);
    return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
  }
}

自定義校驗(yàn)注解

自定義校驗(yàn)注解必須要有三個(gè)內(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)的返回錯(cuò)誤信息

因此需要?jiǎng)?chuàng)建對(duì)應(yīng)的properties/yml文件,并且在其中定義錯(cuò)誤信息的值

例如 com.atguigu.common.valid.ListValue.message=必須提交指定的值!

同時(shí)需要下面這些注解@Target指定注解在那些地方生效,METHOD表示方法、FIELD表示字段其他的類推
@Constraint用來(lái)指定自定義校驗(yàn)的校驗(yàn)器,validatedBy = { ListValueConstraintValidator.class }表示指定ListValueConstraintValidator.class作為校驗(yàn)器,可以有多個(gè)

@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)注解生效,需要有一個(gè)自定義的校驗(yàn)注解器,實(shí)現(xiàn)ConstraintValidator接口需要有兩個(gè)泛型

第一個(gè)是注解類,另一個(gè)是校驗(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字段并且有對(duì)應(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • springboot接入微信app支付的方法

    springboot接入微信app支付的方法

    本文使用springboot集成微信支付服務(wù),包含微信統(tǒng)一支付訂單接口,以及支付回調(diào)接口等,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景

    JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景,JSON.toJSONString是將對(duì)象轉(zhuǎn)化為Json字符串,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Java Vector類詳解及實(shí)例代碼

    Java Vector類詳解及實(shí)例代碼

    這篇文章主要介紹了Java Vector類詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 淺談自定義注解在Spring中的應(yīng)用

    淺談自定義注解在Spring中的應(yīng)用

    這篇文章主要介紹了淺談自定義注解在Spring中的應(yīng)用,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 使用@Value注入map、List,yaml格式方式

    使用@Value注入map、List,yaml格式方式

    這篇文章主要介紹了使用@Value注入map、List,yaml格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • mybatis使用Integer類型查詢可能出現(xiàn)的問題

    mybatis使用Integer類型查詢可能出現(xiàn)的問題

    這篇文章主要介紹了mybatis使用Integer類型查詢可能出現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java?LeetCode刷題稍有難度的貪心構(gòu)造算法

    java?LeetCode刷題稍有難度的貪心構(gòu)造算法

    這篇文章主要為大家介紹了java?LeetCode刷題稍有難度的貪心構(gòu)造題解示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java中循環(huán)冗余校驗(yàn)(CRC32)的實(shí)現(xiàn)

    Java中循環(huán)冗余校驗(yàn)(CRC32)的實(shí)現(xiàn)

    CRC校驗(yàn)實(shí)用程序庫(kù)在數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)通訊領(lǐng)域,為了保證數(shù)據(jù)的正確,就不得不采用檢錯(cuò)的手段,下面這篇文章主要給大家介紹了關(guān)于Java中循環(huán)冗余校驗(yàn)(CRC32)實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • Maven中央倉(cāng)庫(kù)地址配置大全

    Maven中央倉(cāng)庫(kù)地址配置大全

    這篇文章主要介紹了Maven中央倉(cāng)庫(kù)地址配置大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析

    關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析

    這篇文章主要給大家介紹了關(guān)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評(píng)論

密山市| 广汉市| 邵阳县| 修水县| 平顶山市| 察雅县| 苗栗县| 江安县| 汉寿县| 周宁县| 兴隆县| 大同县| 阿荣旗| 禄丰县| 开阳县| 友谊县| 普洱| 和政县| 华容县| 高雄县| 吴忠市| 望江县| 富源县| 乌拉特前旗| 浠水县| 客服| 内丘县| 临沂市| 鸡西市| 南雄市| 靖边县| 双辽市| 镇远县| 阿图什市| 峨眉山市| 密山市| 汝阳县| 罗甸县| 西宁市| 高碑店市| 东宁县|