使用JSR303校驗數據

一、JSR303


JSR-303 是 JAVA EE 6 中的一項子規範,叫做 Bean Validation,官方參考實現是Hibernate Validator。
此實現與 Hibernate ORM 沒有任何關係。 JSR 303 用於對 Java Bean 中的字段的值進行驗證。 
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中對錶單提交的數據方便地驗證。 
可以使用註解的方式進行驗證

二、校驗種類

空檢查

@Null       驗證對象是否爲null

@NotNull    驗證對象是否不爲null, 無法查檢長度爲0的字符串

@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大於0,只對字符串,且會去掉前後空格.

@NotEmpty 檢查約束元素是否爲NULL或者是EMPTY.

 

Booelan檢查

@AssertTrue     驗證 Boolean 對象是否爲 true  

@AssertFalse    驗證 Boolean 對象是否爲 false  

 

長度檢查

@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之內  

@Length(min=, max=) Validates that the annotated string is between min and max included.

 

日期檢查

@Past           驗證 Date 和 Calendar 對象是否在當前時間之前  

@Future     驗證 Date 和 Calendar 對象是否在當前時間之後  

@Pattern    驗證 String 對象是否符合正則表達式的規則

 

數值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因爲表單值爲“”時無法轉換爲int,但可以轉換爲Stirng爲"",Integer爲null

@Min            驗證 Number 和 String 對象是否大等於指定的值  

@Max            驗證 Number 和 String 對象是否小等於指定的值  

@DecimalMax 被標註的值必須不大於約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度

@DecimalMin 被標註的值必須不小於約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度

@Digits     驗證 Number 和 String 的構成是否合法  

@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。

 

@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.

@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;

 

@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)

@CreditCardNumber信用卡驗證

@Email  驗證是否是郵件地址,如果爲null,不進行驗證,算通過驗證。

@ScriptAssert(lang= ,script=, alias=)

@URL(protocol=,host=, port=,regexp=, flags=)

 

三、例子


1)、給bean添加校驗註解javax.validation.constraints,並定義自己的message提示

package com.atguigu.gulimall.product.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import javax.validation.constraints.*;

/**
 * 品牌
 * 
 * @author 
 * @email 
 * @date 2020-04-04 20:23:57
 */
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 品牌id
	 */
	@TableId
	private Long brandId;
	/**
	 * 品牌名
	 */
	@NotBlank(message = "品牌名必須提交")
	private String name;
	/**
	 * 品牌logo地址
	 */
	@NotEmpty
	@URL(message = "logo必須是一個合法的URL地址")
	private String logo;
	/**
	 * 介紹
	 */
	private String descript;
	/**
	 * 顯示狀態[0-不顯示;1-顯示]
	 */
	private Integer showStatus;
	/**
	 * 檢索首字母
	 */
	@NotEmpty
	@Pattern(regexp = "/^[a-zA-z]$/",message = "檢索首字母必須是一個字母")
	private String firstLetter;
	/**
	 * 排序
	 */
	@NotNull
	@Min(value = 0,message = "排序必須大於等於0")
	private Integer sort;

}
2)、開啓校驗功能@Valid
    效果:校驗錯誤以後會有默認的響應
3)、給校驗的bean後緊跟一個BindingResult,就可以獲取到校驗結果
/**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
        if(result.hasErrors()){
            Map<String,String> map = new HashMap<>();
            //1、獲取校驗的錯誤結果
            result.getFieldErrors().forEach((item)->{
                //FieldError 獲取到錯誤提示
                String message = item.getDefaultMessage();
                //獲取錯誤的屬性的名字
                String field = item.getField();
                map.put(field,message);
            });
           return R.error(400,"提交的數據不合法").put("data",map);
        }else {
            brandService.save(brand);
        }


        return R.ok();
    }

提交測試

獲得校驗結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章