溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

springboot validation參數(shù)校驗的實例分析

發(fā)布時間:2021-09-13 11:15:27 來源:億速云 閱讀:151 作者:chen 欄目:編程語言

這篇文章主要介紹“springboot validation參數(shù)校驗的實例分析”,在日常操作中,相信很多人在springboot validation參數(shù)校驗的實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”springboot validation參數(shù)校驗的實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

對于任何一個應(yīng)用而言在客戶端做的數(shù)據(jù)有效性驗證都不是安全有效的,這時候就要求我們在開發(fā)的時候在服務(wù)端也對數(shù)據(jù)的有效性進行驗證。 Spring Boot自身對數(shù)據(jù)在服務(wù)端的校驗有一個比較好的支持,它能將我們提交到服務(wù)端的數(shù)據(jù)按照我們事先的約定進行數(shù)據(jù)有效性驗證。

1 pom依賴

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-validation</artifactId></dependency>

2 校驗使用實例

配置要驗證的請求實體

public class User {  @Null  private Long id;  @NotBlank  private String name;  @Email  private String email;  // 省略getter和setter}

控制器方法配置

@PostMapping("/addUser")public String addUser(@Valid @RequestBody User user){  ...}

校驗失敗統(tǒng)一處理

校驗失敗時將拋出MethodArgumentNotValidException異常

/** * 全局Exception處理 * * @author liusq * */@RestControllerAdvicepublic class GlobalExceptionHandler {  private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);  @SuppressWarnings("rawtypes")  @ExceptionHandler(value = Exception.class)  public ResponseEntity handle(Exception e) {    if (e instanceof MethodArgumentNotValidException) {      BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();      if (bindingResult.hasErrors() && bindingResult.hasFieldErrors()) {        FieldError fieldError = bindingResult.getFieldError();        BodyValidStatus bodyValidStatus = new BodyValidStatus.Builder().code("0009")            .message(fieldError.getDefaultMessage())            .field(fieldError.getField()).build();        LOGGER.warn(bodyValidStatus.getMessage() + e);        return new ResponseEntity<>(bodyValidStatus, HttpStatus.OK);      } else {        bodyStatus = DataUtil.bodyStatus("0009");      }    } else {      bodyStatus = DataUtil.bodyStatus(Constants.ERROR_CODE);    }    LOGGER.error(bodyStatus.getMessage() + e);    return new ResponseEntity<>(bodyStatus, HttpStatus.OK);  }}public class BodyValidStatus {  // 錯誤代碼  private String code;  // 錯誤代碼解釋  private String message;  // 錯誤字段  private String field;  public BodyValidStatus() {  }  public BodyValidStatus(String code, String message, String field) {    this.code = code;    this.message = message;    this.field = field;  }  private BodyValidStatus(Builder builder) {    setCode(builder.code);    setMessage(builder.message);    setField(builder.field);  }  public String getCode() {    return code;  }  public void setCode(String code) {    this.code = code;  }  public String getMessage() {    return message;  }  public void setMessage(String message) {    this.message = message;  }  public String getField() {    return field;  }  public void setField(String field) {    this.field = field;  }  @Override  public String toString() {    return ToStringBuilder.reflectionToString(this);  }  public static final class Builder {    private String code;    private String message;    private String field;    public Builder() {    }    public Builder code(String val) {      code = val;      return this;    }    public Builder message(String val) {      message = val;      return this;    }    public Builder field(String val) {      field = val;      return this;    }    public BodyValidStatus build() {      return new BodyValidStatus(this);    }  }}

3 驗證注解詳解

驗證注解

驗證的數(shù)據(jù)類型

說明

空檢查

@Null

任意類型

驗證注解的元素值是null

@NotNull

任意類型

驗證注解的元素不是null

@NotBlank

CharSequence子類型(CharBuffer、String、StringBuffer、StringBuilder)

驗證注解的元素值不為空(不為null、去除首尾空格后長度不為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時會去除字符串的首尾空格

@NotEmpty

CharSequence子類型、Collection、Map、數(shù)組

驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)

Boolean檢查

@AssertFalse

Boolean,boolean

驗證注解的元素值是false

@AssertTrue

Boolean,boolean

驗證注解的元素值是true

長度檢查

@Size(min=下限, max=上限)

字符串、Collection、Map、數(shù)組等

驗證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小

@Length(min=下限, max=上限)

CharSequence子類型

驗證注解的元素值長度在min和max區(qū)間內(nèi)

日期檢查

@Past

java.util.Date,java.util.Calendar;Joda Time類庫的日期類型

驗證注解的元素值(日期類型)比當(dāng)前時間早

@Future

與@Past要求一樣

驗證注解的元素值(日期類型)比當(dāng)前時間晚

數(shù)值檢查

@MIN(value=值)

BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲的是數(shù)字)子類型

驗證注解的元素值大于等于@Min指定的value值

@MAX(value=值)

和@Min要求一樣

驗證注解的元素值小于等于@Max指定的value值

@DecimalMin(value=值)

和@Min要求一樣

驗證注解的元素值大于等于@ DecimalMin指定的value值

@DecimalMax(value=值)

和@Min要求一樣

驗證注解的元素值小于等于@ DecimalMax指定的value值

@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù))

和@Min要求一樣

驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限

@Range(min=最小值, max=最大值)

BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型

驗證注解的元素值在最小值和最大值之間

其他檢查

@Valid

任何非原子類型

指定遞歸驗證關(guān)聯(lián)的對象;如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,在地址對象上加@Valid注解即可級聯(lián)驗證

@Pattern(regexp=正則表達式,flag=標(biāo)志的模式)

CharSequence的子類型

驗證注解的元素值與指定的正則表達式匹配

@Email(regexp=正則表達式,flag=標(biāo)志的模式)

CharSequence的子類型

驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式

@CreditCardNumber

CharSequence的子類型

驗證注解元素值是信用卡卡號

@ScriptAssert(lang= ,script=)

業(yè)務(wù)類

校驗復(fù)雜的業(yè)務(wù)邏輯

4 自定義驗證注解和驗證規(guī)則

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import javax.validation.Constraint;import javax.validation.Payload;import com.xxx.xxx.constraint.impl.MoneyValidator;@Target({ElementType.FIELD, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy=MoneyValidator.class)public @interface Money {  String message() default"不是金額形式";  Class<?>[] groups() default {};  Class<? extends Payload>[] payload() default {};}import java.util.regex.Pattern;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import com.xxx.xxx.constraint.Money;public class MoneyValidator implements ConstraintValidator<Money, Double> {  private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金額的正則表達式  private Pattern moneyPattern = Pattern.compile(moneyReg);  public void initialize(Money money) {    // TODO Auto-generated method stub  }  public boolean isValid(Double value, ConstraintValidatorContext arg1) {    // TODO Auto-generated method stub    if (value == null)      return true;    return moneyPattern.matcher(value.toString()).matches();  }}

到此,關(guān)于“springboot validation參數(shù)校驗的實例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI