spring boot validation參數(shù)校驗(yàn)實(shí)例分析
本文實(shí)例講述了spring boot validation參數(shù)校驗(yàn)。分享給大家供大家參考,具體如下:
對(duì)于任何一個(gè)應(yīng)用而言在客戶端做的數(shù)據(jù)有效性驗(yàn)證都不是安全有效的,這時(shí)候就要求我們?cè)陂_(kāi)發(fā)的時(shí)候在服務(wù)端也對(duì)數(shù)據(jù)的有效性進(jìn)行驗(yàn)證。 Spring Boot自身對(duì)數(shù)據(jù)在服務(wù)端的校驗(yàn)有一個(gè)比較好的支持,它能將我們提交到服務(wù)端的數(shù)據(jù)按照我們事先的約定進(jìn)行數(shù)據(jù)有效性驗(yàn)證。
1 pom依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2 校驗(yàn)使用實(shí)例
- 配置要驗(yàn)證的請(qǐng)求實(shí)體
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){
...
}
- 校驗(yàn)失敗統(tǒng)一處理
校驗(yàn)失敗時(shí)將拋出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 {
// 錯(cuò)誤代碼
private String code;
// 錯(cuò)誤代碼解釋
private String message;
// 錯(cuò)誤字段
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 驗(yàn)證注解詳解
|
驗(yàn)證注解 |
驗(yàn)證的數(shù)據(jù)類型 |
說(shuō)明 |
|
空檢查 |
||
|
@Null |
任意類型 |
驗(yàn)證注解的元素值是null |
|
@NotNull |
任意類型 |
驗(yàn)證注解的元素不是null |
|
@NotBlank |
CharSequence子類型(CharBuffer、String、StringBuffer、StringBuilder) |
驗(yàn)證注解的元素值不為空(不為null、去除首尾空格后長(zhǎng)度不為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的首尾空格 |
|
@NotEmpty |
CharSequence子類型、Collection、Map、數(shù)組 |
驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0) |
|
Boolean檢查 |
||
|
@AssertFalse |
Boolean,boolean |
驗(yàn)證注解的元素值是false |
|
@AssertTrue |
Boolean,boolean |
驗(yàn)證注解的元素值是true |
|
長(zhǎng)度檢查 |
||
|
@Size(min=下限, max=上限) |
字符串、Collection、Map、數(shù)組等 |
驗(yàn)證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長(zhǎng)度、集合大小 |
|
@Length(min=下限, max=上限) |
CharSequence子類型 |
驗(yàn)證注解的元素值長(zhǎng)度在min和max區(qū)間內(nèi) |
|
日期檢查 |
||
|
@Past |
java.util.Date,java.util.Calendar;Joda Time類庫(kù)的日期類型 |
驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早 |
|
@Future |
與@Past要求一樣 |
驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間晚 |
|
數(shù)值檢查 |
||
|
@MIN(value=值) |
BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲(chǔ)的是數(shù)字)子類型 |
驗(yàn)證注解的元素值大于等于@Min指定的value值 |
|
@MAX(value=值) |
和@Min要求一樣 |
驗(yàn)證注解的元素值小于等于@Max指定的value值 |
|
@DecimalMin(value=值) |
和@Min要求一樣 |
驗(yàn)證注解的元素值大于等于@ DecimalMin指定的value值 |
|
@DecimalMax(value=值) |
和@Min要求一樣 |
驗(yàn)證注解的元素值小于等于@ DecimalMax指定的value值 |
|
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù)) |
和@Min要求一樣 |
驗(yàn)證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限 |
|
@Range(min=最小值, max=最大值) |
BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 |
驗(yàn)證注解的元素值在最小值和最大值之間 |
|
其他檢查 |
||
|
@Valid |
任何非原子類型 |
指定遞歸驗(yàn)證關(guān)聯(lián)的對(duì)象;如用戶對(duì)象中有個(gè)地址對(duì)象屬性,如果想在驗(yàn)證用戶對(duì)象時(shí)一起驗(yàn)證地址對(duì)象的話,在地址對(duì)象上加@Valid注解即可級(jí)聯(lián)驗(yàn)證 |
|
@Pattern(regexp=正則表達(dá)式,flag=標(biāo)志的模式) |
CharSequence的子類型 |
驗(yàn)證注解的元素值與指定的正則表達(dá)式匹配 |
|
@Email(regexp=正則表達(dá)式,flag=標(biāo)志的模式) |
CharSequence的子類型 |
驗(yàn)證注解的元素值是Email,也可以通過(guò)regexp和flag指定自定義的email格式 |
|
@CreditCardNumber |
CharSequence的子類型 |
驗(yàn)證注解元素值是信用卡卡號(hào) |
|
@ScriptAssert(lang= ,script=) |
業(yè)務(wù)類 |
校驗(yàn)復(fù)雜的業(yè)務(wù)邏輯 |
4 自定義驗(yàn)證注解和驗(yàn)證規(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})?$";//表示金額的正則表達(dá)式
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框架入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
- SpringBoot集成Validation參數(shù)校驗(yàn)
- SpringBoot使用validation做參數(shù)校驗(yàn)的實(shí)現(xiàn)步驟
- SpringBoot使用validation-api實(shí)現(xiàn)對(duì)枚舉類參數(shù)校驗(yàn)的方法
- SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)的示例
- springboot+dubbo+validation 進(jìn)行rpc參數(shù)校驗(yàn)的實(shí)現(xiàn)方法
- spring?參數(shù)校驗(yàn)Validation示例詳解
相關(guān)文章
Java實(shí)戰(zhàn)之課程信息管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java實(shí)現(xiàn)課程信息管理系統(tǒng),文中采用到的技術(shù)有:Springboot、SpringMVC、MyBatis、FreeMarker等,感興趣的可以了解一下2022-04-04
springboot源碼中this::selfInitialize怪異用法的含義解析
這篇文章主要介紹了springboot源碼中this::selfInitialize怪異用法的含義解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)?lái)一篇Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

