您好,登錄后才能下訂單哦!
這篇文章主要介紹“springboot validation參數校驗的實例分析”,在日常操作中,相信很多人在springboot validation參數校驗的實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”springboot validation參數校驗的實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
對于任何一個應用而言在客戶端做的數據有效性驗證都不是安全有效的,這時候就要求我們在開發的時候在服務端也對數據的有效性進行驗證。 Spring Boot自身對數據在服務端的校驗有一個比較好的支持,它能將我們提交到服務端的數據按照我們事先的約定進行數據有效性驗證。
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){ ...}
校驗失敗統一處理
校驗失敗時將拋出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 驗證注解詳解
驗證注解
驗證的數據類型
說明
空檢查
@Null
任意類型
驗證注解的元素值是null
@NotNull
任意類型
驗證注解的元素不是null
@NotBlank
CharSequence子類型(CharBuffer、String、StringBuffer、StringBuilder)
驗證注解的元素值不為空(不為null、去除首尾空格后長度不為0),不同于@NotEmpty,@NotBlank只應用于字符串且在比較時會去除字符串的首尾空格
@NotEmpty
CharSequence子類型、Collection、Map、數組
驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
Boolean檢查
@AssertFalse
Boolean,boolean
驗證注解的元素值是false
@AssertTrue
Boolean,boolean
驗證注解的元素值是true
長度檢查
@Size(min=下限, max=上限)
字符串、Collection、Map、數組等
驗證注解的元素值的在min和max(包含)指定區間之內,如字符長度、集合大小
@Length(min=下限, max=上限)
CharSequence子類型
驗證注解的元素值長度在min和max區間內
日期檢查
@Past
java.util.Date,java.util.Calendar;Joda Time類庫的日期類型
驗證注解的元素值(日期類型)比當前時間早
@Future
與@Past要求一樣
驗證注解的元素值(日期類型)比當前時間晚
數值檢查
@MIN(value=值)
BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲的是數字)子類型
驗證注解的元素值大于等于@Min指定的value值
@MAX(value=值)
和@Min要求一樣
驗證注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值)
和@Min要求一樣
驗證注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值)
和@Min要求一樣
驗證注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整數位數, fraction=小數位數)
和@Min要求一樣
驗證注解的元素值的整數位數和小數位數上限
@Range(min=最小值, max=最大值)
BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型
驗證注解的元素值在最小值和最大值之間
其他檢查
@Valid
任何非原子類型
指定遞歸驗證關聯的對象;如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,在地址對象上加@Valid注解即可級聯驗證
@Pattern(regexp=正則表達式,flag=標志的模式)
CharSequence的子類型
驗證注解的元素值與指定的正則表達式匹配
@Email(regexp=正則表達式,flag=標志的模式)
CharSequence的子類型
驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式
@CreditCardNumber
CharSequence的子類型
驗證注解元素值是信用卡卡號
@ScriptAssert(lang= ,script=)
業務類
校驗復雜的業務邏輯
4 自定義驗證注解和驗證規則
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(); }}
到此,關于“springboot validation參數校驗的實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。