最近項目在使用如@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 {}; }
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; } }
@Data public class User { @MyConstraint( min = 1, max =10 ) private String name; private String address; }
@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"; } } }
@RestController public class Hello { @RequestMapping(value = "hello") public User hello(@Valid User user){ return user; } }
不輸入值,爲null時
正則表達式
輸入空格
app
輸入超過長度
ide
輸入正常值
測試
使用註解驗證參數配合異常處理,很方便且減小了不少業務代碼,各類if判斷確定讓人看的頭痛。好了,玩的開心!code