@NotNull和@NonNull的區別和使用

區別

@NotNull在類字段中使用,表示該字段不能爲空。它是 JSR303(Bean的校驗框架)的註解。在調用controller的方法中加入@Valid就可以驗證該方法參數中該類的對應屬性是否爲空,如果爲空,註解中的提示信息會保存在result中。

@NonNull在方法或構造函數的參數上使用,表示該參數不能爲空。

@NotNull使用

/**
 * user類
 */
@Data
public class User {

    private int id;
    @NotNull(message = "babyId不能爲空")
    private String babyId;
}
/**
 * controller的方法
 * controller方法要加上@Valid ,表示需要驗證!
 */
 @PostMapping("getMyUser")
 @ResponseBody
 public Baby getBaby(@Valid @RequestBody User user){
 	return babyService.getBabyById(user.getBabyId());
 }

此時調用controller的getBaby方法時如果user中babyId爲空,那麼程序會報MethodArgumentNotValidException

獲取錯誤信息

將上面的getBaby改爲下面的例子:

@PostMapping("getMyUser")
@ResponseBody
public Baby getBaby(@Valid @RequestBody User user,Errors errors){
    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();
        System.out.println("key:"+key+";msg="+msg);
    }
    return babyService.getBabyById(user.getBabyId());
}

此時程序不會報錯,但是可以獲取錯誤信息:

key:babyId;msg=babyId不能爲空

其他註解及解釋

除了@NotNull,還有其他類似的註解,都是在類字段上使用

  • @Null 被註釋的元素必須爲null

  • @NotNull 被註釋的元素不能爲null,可以爲空字符串

*@AssertTrue 被註釋的元素必須爲true

*@AssertFalse 被註釋的元素必須爲false

*@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值

*@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值

*@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值

*@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值

*@Size(max,min) 被註釋的元素的大小必須在指定的範圍內。

*@Digits(integer,fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內

*@Past 被註釋的元素必須是一個過去的日期

*@Future 被註釋的元素必須是一個將來的日期

*@Pattern(value) 被註釋的元素必須符合指定的正則表達式。

*@Email 被註釋的元素必須是電子郵件地址

*@Length 被註釋的字符串的大小必須在指定的範圍內

*@Range 被註釋的元素必須在合適的範圍內

*@NotEmpty:用在集合類上,不能爲null,並且長度必須大於0

*@NotBlank:只能作用在String上,不能爲null,而且調用trim()後,長度必須大於0

@NonNull使用

@Override
@Transactional
public Baby getBabyById(@NonNull String babyId) {
    return babyMapper.getBabyById(babyId);
}

如果 babyId 爲空getBabyById會報NullPointerException

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