本文實例講述了spring boot validation參數(shù)校驗。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)公司是一家專注于做網(wǎng)站、網(wǎng)站設(shè)計與策劃設(shè)計,景泰網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:景泰等地區(qū)。景泰做網(wǎng)站價格咨詢:028-86922220
對于任何一個應(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){ ... }
校驗失敗時將拋出MethodArgumentNotValidException異常
/** * 全局Exception處理 * * @author liusq * */ @RestControllerAdvice public 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)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Spring框架入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
網(wǎng)站欄目:springbootvalidation參數(shù)校驗實例分析
標(biāo)題網(wǎng)址:http://jinyejixie.com/article20/gcecjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、小程序開發(fā)、、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)