springboot學習(二十二)_ 使用@Constraint註解自定義驗證註解

最近項目在使用如@NotNull @Max 等配合@vaild 註解進行驗證傳過來的參數校驗,而後經過統一異常處理,直接返回給前端,不用在業務代碼中對這些參數進行校驗。可是官方提供的並不能所有知足項目的需求,我通過查找發現了@Constraint這個註解。前端

Constraint    詳細信息

@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)    被註釋的元素必須符合指定的正則表達式

需求

如今有的列表查詢,根據查詢條件進行查詢,固然這些查詢條件能夠爲null,若是存在值,就必須進行驗證。這裏就對長度就行驗證,不爲nul的時候 輸入字符不能爲空串,且長度必須大於等於1且小於等於10git

代碼實現

一、定義自定義註解

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//表明處理邏輯是MyConstraintValidator類
@Constraint(validatedBy = MyConstraintValidator.class)

public @interface MyConstraint {

    String message() default "參數校驗不經過,請從新輸入";;

    long min();

    long max();


    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

2.處理類,須要實現ConstraintValidator接口

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
     private long max = 1;
     private long min = 1;

    @Override
    public void initialize(MyConstraint constraintAnnotation) {
         max = constraintAnnotation.max();
         min = constraintAnnotation.min();
        System.out.println("my validator init");

    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        if(o == null){
            return true;
        }

        if(o.toString().trim().length()>=min && o.toString().trim().length()<=max){
            return true;
        }

        return false;
    }
}

3.進行驗證

3.1 定義一個實體類User

@Data
public class User {

    @MyConstraint( min = 1, max =10 )
    private String name;
    private String address;

}

3.2 全局異常中進行處理,這裏只是看下效果,返回String字符串

@RestControllerAdvice
@Slf4j
public class KevinExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        log.error(e.getMessage(), e);

        if (e instanceof BindException) {
            BindException ex = (BindException) e;
            List<ObjectError> allErrors = ex.getAllErrors();
            ObjectError error = allErrors.get(0);
            String defaultMessage = error.getDefaultMessage();
            return defaultMessage;
        }  else {
            return "error";
        }
    }
}

3.3controller測試方法

@RestController
public class Hello {

    @RequestMapping(value = "hello")
    public User hello(@Valid User user){
        return user;
    }
}

3.4 經過swagger 進行驗證

  • 不輸入值,爲null時
    正則表達式

  • 輸入空格
    app

  • 輸入超過長度
    ide

  • 輸入正常值
    測試

總結

使用註解驗證參數配合異常處理,很方便且減小了不少業務代碼,各類if判斷確定讓人看的頭痛。好了,玩的開心!code

相關文章
相關標籤/搜索