admin管理员组

文章数量:1794759

SpringBoot自定义注解参数校验

SpringBoot自定义注解参数校验

参考

SpringBoot 参数校验的方法 - 木白的菜园 - 博客园

更加灵活的参数校验,Spring-boot自定义参数校验注解_d1874的博客-CSDN博客


常用注解
  • @AssertFalse 所注解的元素必须是Boolean类型,且值为false
  • @AssertTrue 所注解的元素必须是Boolean类型,且值为true
  • @DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
  • @DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
  • @Digits 所注解的元素必须是数字,且值必须是指定的位数
  • @Future 所注解的元素必须是将来某个日期
  • @Max 所注解的元素必须是数字,且值小于等于给定的值
  • @Min 所注解的元素必须是数字,且值小于等于给定的值
  • @Range 所注解的元素需在指定范围区间内
  • @NotNull 所注解的元素值不能为null
  • @NotBlank 所注解的元素值有内容
  • @Null 所注解的元素值为null
  • @Past 所注解的元素必须是某个过去的日期
  • @PastOrPresent 所注解的元素必须是过去某个或现在日期
  • @Pattern 所注解的元素必须满足给定的正则表达式
  • @Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
  • @Email 所注解的元素需满足Email格式

自定义注解

import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = PhoneValidator.class) public @interface CheckPhone { String message() default "手机格式不合法"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

@Constraint(validatedBy = PhoneValidator.class) 指定这个注解校验的类 自定义校验类

import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.regex.Pattern; /** * 手机号码校验器 * * @author sun 2020/7/21 16:36 */ public class PhoneValidator implements ConstraintValidator<CheckPhone,String> { @Override public boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) { if (phone.length() != 11) { return false; } // 移动号段正则表达式 Pattern pattern = Patternpile("^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\\\d{8}|(1705)\\\\d{7}$"); if (pattern.matcher(phone).matches()) { return true; } // 联通号段正则表达式 pattern = Patternpile("^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\\\d{8}|(1709)\\\\d{7}$"); if (pattern.matcher(phone).matches()) { return true; } // 电信号段正则表达式 pattern = Patternpile("^((133)|(153)|(177)|(18[0,1,9])|(149))\\\\d{8}$"); if (pattern.matcher(phone).matches()) { return true; } //虚拟运营商正则表达式 pattern = Patternpile("^((170))\\\\d{8}|(1718)|(1719)\\\\d{7}$"); return pattern.matcher(phone).matches(); } }

全局异常捕获

格式化输出异常

import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.Set; /** * 全局异常处理类 * * @author sun */ @RestControllerAdvice public class GlobalExceptionHandler { /** * 参数校验全局异常 */ @ExceptionHandler(ConstraintViolationException.class) public Result handlerValidator(ConstraintViolationException constraintViolationException) { Set<ConstraintViolation<?>> constraintViolationSets = constraintViolationException.getConstraintViolations(); // Result的为我自定义的全局响应对象 // constraintViolationSets.iterator().next().getMessage()为错误信 return Result.fail(constraintViolationSets.iterator().next().getMessage()); } }

用法

如果是单个字段的校验,需要再当前类上加校验注解

import org.springframework.validation.annotation.Validated;

可以了

本文标签: 自定义注解参数SpringBoot