首页
点滴
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); } } ``` #### 测试结果可以看出自定义注解已生效  #### 这个返回格式的前提是配置的全局异常处理,请看上一篇文章[SpringBoot 全局统一异常处理](http://www.chenhuazhan.com/115 "SpringBoot 全局统一异常处理")
博客分类
Java (6)
Linux (6)
Docker (3)
SpringBoot (9)
微服务 (1)
Redis (13)
Mysql (2)
VMware (3)
Nginx (9)
Mybatis (2)
工具类 (3)
友情链接
权限管理系统
layui
© 2019 chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1