spring boot(6)validation參數校驗

      對於任何一個應用而言在客戶端作的數據有效性驗證都不是安全有效的,這時候就要求咱們在開發的時候在服務端也對數據的有效性進行驗證。 Spring Boot自身對數據在服務端的校驗有一個比較好的支持,它能將咱們提交到服務端的數據按照咱們事先的約定進行數據有效性驗證。java

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異常git

/**
 * 全局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 驗證註解詳解

驗證註解正則表達式

驗證的數據類型spring

說明數組

空檢查安全

@Nullapp

任意類型ide

驗證註解的元素值是nullspring-boot

@NotNullui

任意類型

驗證註解的元素不是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();  
    }  
   
}
相關文章
相關標籤/搜索