首页
点滴
SpringBoot 自定义注解校验参数
#### 下面是java类库已经提供的一些数据校验注解 注解 -- 作用类型 -- 解释 @NotNull -- 任何类型 -- 属性不能为null @NotEmpty -- 集合 -- 集合不能为null,且size大于0 @NotBlank -- 字符串、字符 -- 字符类不能为null,且去掉空格之后长度大于0 @AssertTrue -- Boolean、boolean -- 布尔属性必须是true @Min -- 数字类型(原子和包装) -- 限定数字的最小值(整型) @Max -- 同@Min -- 限定数字的最大值(整型) @DecimalMin -- 同@Min -- 限定数字的最小值(字符串,可以是小数) @DecimalMax -- 同@Min -- 限定数字的最大值(字符串,可以是小数) @Range -- 数字类型(原子和包装) -- 限定数字范围(长整型) @Length -- 字符串 -- 限定字符串长度 @Size -- 集合 -- 限定集合大小 @Past -- 时间、日期 -- 必须是一个过去的时间或日期 @Future -- 时期、时间 -- 必须是一个未来的时间或日期 @Email -- 字符串 -- 必须是一个邮箱格式 @Pattern -- 字符串、字符 -- 正则匹配字符串 #### 上面的数据校验注解并不能够满足我们全部需求,这时候就需要我们自定义数据校验注解了。 > 这里就拿 ip地址校验,和手机号码校验来做 #### 分别新建ip,和phone的校验器 ``` /** * ip地址校验 * @author Frank * */ public class IpValidator implements ConstraintValidator
{ private Pattern pattern = Pattern.compile("([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { return StringUtils.isNotBlank(value) ? pattern.matcher(value).matches() : true; } } ``` ``` /** * 手机号码校验 * @author Frank * */ public class PhoneValidator implements ConstraintValidator
{ private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { return StringUtils.isNotBlank(value) ? pattern.matcher(value).matches() : true; } } ``` #### 自定义注解ip,和phone ``` /** * 自定义注解ip地址校验 * @author Frank * */ @Constraint(validatedBy = IpValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Ip { String message() default "ip地址不合法"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; } ``` ``` /** * 自定义注解手机号校验 * @author Frank * */ @Constraint(validatedBy = PhoneValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Phone { String message() default "手机号格式不合法"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; } ``` #### 元注解的作用就是负责注解其他注解 @Documented ``` 可以作用于类上及类方法上,表明这个注释是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分 ``` @Target ``` 是用来修饰注解的元注解,它有一个属性ElementType是枚举类型 ElementType.TYPE:类、接口(包括注释类型)或枚举声明 ElementType.FIELD:字段声明(包括枚举常量) ElementType.METHOD:方法声明 ElementType.PARAMETER:形式参数声明 ElementType.CONSTRUCTOR:构造函数声明 ElementType.LOCAL_VARIABLE:局部变量声明 ElementType.ANNOTATION_TYPE:批注类型声明 ElementType.PACKAGE:包声明 ElementType.TYPE_PARAMETER:类型参数声明 ElementType.TYPE_USE:类型的使用 ElementType.MODULE:模块声明 ``` @Retention ``` 是用来修饰注解的元注解,它有一个属性RetentionPolicy是枚举类型 RetentionPolicy.SOURCE:注释将被编译器丢弃 RetentionPolicy.CLASS:注释将由编译器记录在类文件中,但不需要在运行时由VM保留。这是默认行为 RetentionPolicy.RUNTIME:注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射地读取注释 ``` @Constraint(validatedBy = { }) ``` validatedBy属性指定了需要进行校验的策略类集合,这是一个数组 {} 数组中的类要 implements ConstraintValidator
接口,ConstraintValidator第一个类型是自定义校验注解,第二个是使用自定义注解接受参数的实体类 ``` #### 使用 > 1、在实体类型需要校验的字段上加上注解 ``` public class User { private Integer id; private String name; @Phone private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } ``` 2、在controller入参中加上 @Validated 注解 ``` @RestController public class ValidatorTestController { @RequestMapping("/validatorTest") public AjaxResult validatorTest(@Validated User user) { return AjaxResult.success(user); } } ``` #### 测试结果可以看出自定义注解已生效 ![](/images/20200321020744903.png) #### 这个返回格式的前提是配置的全局异常处理,请看上一篇文章[SpringBoot 全局统一异常处理](http://www.chenhuazhan.com/115 "SpringBoot 全局统一异常处理")
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146