@NotNull使用在Bean的字段注解中隙券。它是 JSR303(Bean的校驗框架)的注解,在controller的方法中驗證時(運行時檢查一個屬性是否為空)使用或颊,如果不合法(為空)绪商,注解中的提示信息會保存在result中咪奖。
@NonNull 在方法或構造函數(shù)的參數(shù)上使用,生成一個空值檢查語句治筒。用于指明所修飾的參數(shù)屉栓,字段或方法的值不可以為null。它是JSR 305(缺陷檢查框架)的注解耸袜,是告訴編譯器這個域不可能為空友多,當代碼檢查(靜態(tài)檢查)有空值時會給出一個風險警告。運行時不報任何警告堤框,根據(jù)實際值得情況運行時可能出現(xiàn)空指針異常域滥。 目前這個注解只有IDEA支持。實際好多靜態(tài)掃描工具中有此注解符號
例如:
public class User implements Serializable {
//主鍵
@NotNull(message = "primary is not null",groups = {GroupInterface1.class})
private Long id;
@Pattern(regexp = "[0123456789]",groups = {GroupInterface1.class,GroupInterface2.class},message = "hava a error Date")
private Long maxDiscountAmount;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@Future(message = "expireTime is not less than now",groups = {GroupInterface1.class,GroupInterface2.class})
@NotNull(message = "expireTime is not null",groups = {GroupInterface1.class,GroupInterface2.class})
private Date expireTime;
}
import java.util.Date;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Email;
import javax.validation.constraints.Future;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
/**** imports ****/
public class ValidatorPojo {
// 非空判斷
@NotNull(message = "id不能為空")
private Long id;
@Future(message = "需要一個將來日期") // 只能是將來的日期
// @Past //只能去過去的日期
@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化轉換
@NotNull // 不能為空
private Date date;
@NotNull // 不能為空
@DecimalMin(value = "0.1") // 最小值0.1元
@DecimalMax(value = "10000.00") // 最大值10000元
private Double doubleValue = null;
@Min(value = 1, message = "最小值為1") // 最小值為1
@Max(value = 88, message = "最大值為88") // 最大值88
@NotNull // 不能為空
private Integer integer;
@Range(min = 1, max = 888, message = "范圍為1至888") // 限定范圍
private Long range;
// 郵箱驗證
@Email(message = "郵箱格式錯誤")
private String email;
@Size(min = 20, max = 30, message = "字符串長度要求20到30之間蜈抓。")
private String size;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Double getDoubleValue() {
return doubleValue;
}
public void setDoubleValue(Double doubleValue) {
this.doubleValue = doubleValue;
}
public Integer getInteger() {
return integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public Long getRange() {
return range;
}
public void setRange(Long range) {
this.range = range;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
/**** setter and getter ****/
}
此時controller應該要加上@Valid ,否則不會驗證!
/***
* 解析驗證參數(shù)錯誤
* @param vp —— 需要驗證的POJO启绰,使用注解@Valid 表示驗證
* @param errors 錯誤信息,它由Spring MVC通過驗證POJO后自動填充
* @return 錯誤信息Map
*/
@RequestMapping(value = "/valid/validate")
@ResponseBody
public Map<String, Object> validate(
@Valid @RequestBody ValidatorPojo vp, Errors errors) {
Map<String, Object> errMap = new HashMap<>();
// 獲取錯誤列表
List<ObjectError> oes = errors.getAllErrors();
for (ObjectError oe : oes) {
String key = null;
String msg = null;
// 字段錯誤
if (oe instanceof FieldError) {
FieldError fe = (FieldError) oe;
key = fe.getField();// 獲取錯誤驗證字段名
} else {
// 非字段錯誤
key = oe.getObjectName();// 獲取驗證對象名稱
}
// 錯誤信息
msg = oe.getDefaultMessage();
errMap.put(key, msg);
}
return errMap;
}
除了@NotNull沟使,還有其他類似的注解委可,已顯示在例子中
@Null 被注釋的元素必須為null
@NotNull 被注釋的元素不能為null,可以為空字符串
@AssertTrue 被注釋的元素必須為true
@AssertFalse 被注釋的元素必須為false
@Min(value) 被注釋的元素必須是一個數(shù)字腊嗡,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個數(shù)字着倾,其值必須小于等于指定的最大值
@DecimalMin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個數(shù)字叽唱,其值必須小于等于指定的最大值
@Size(max,min) 被注釋的元素的大小必須在指定的范圍內屈呕。
@Digits(integer,fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內
@Past 被注釋的元素必須是一個過去的日期
@Future 被注釋的元素必須是一個將來的日期
@Pattern(value) 被注釋的元素必須符合指定的正則表達式棺亭。
@Email 被注釋的元素必須是電子郵件地址
@Length 被注釋的字符串的大小必須在指定的范圍內
@Range 被注釋的元素必須在合適的范圍內
@NotEmpty:用在集合類上虎眨,不能為null,并且長度必須大于0
@NotBlank:只能作用在String上,不能為null嗽桩,而且調用trim()后岳守,長度必須大于0
在構造器使用
public User(@NonNull String name) {
this.name=name;
}
new User(null);//靜態(tài)檢查會報警告,運行時若使用了name的方法碌冶,會報異常