自定义注解扩展springMvc的validation注解
前言
我们都知道 springMvc 的检验框架使用的是 hibernate 的 validator ,检验数据,是有那么一点小爽快;
但是,validator 提供的注解,总有那么一点不能适应我们的需求的;
比如前台传来一个 User 对象,我们对其各个字段进行校验,validator 本身已经有诸多的注解来完成校验了,但是需要对 用户ID 进行校验,也就是对 基本数据类型 进行校验,没有找到合适的注解;
自定义校验注解
实现对 int 类型数据进行校验,其中校验规则,自定义,我这里设定的是,根据传入的 min 和 max 判定是否满足条件 ;
default 的含义是,如果此属性在注解中,没有明确的赋值,则使用在开发注解的时候的赋予的默认值;
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { IntegerValidImpl.class})
public @interface IntegerValid {
// 在注解没有显示申明,则min值默认是 0
int min() default 0;
// 在注解没有显示申明,则min值默认是 2147483647
int max() default 2147483647;
// 错误信息
String message() default "{不合法的int}";
// 分组信息
Class<?>[] groups() default {};
// 不知道是干嘛的。。。
Class<? extends Payload>[] payload() default {};
}
/**
* 自定义类,用于对校验注解规则的实现
* 实现 ConstraintValidator 接口,泛型,第一个是对什么注解进行实现,第二个是检验的数据的数据类型 ;
*/
class IntegerValidImpl implements ConstraintValidator<IntegerValid, Integer> {
private int min;
private int max;
/**
* 初始化方法,在里面进行一些设定,我在这里获取注解中属性值,方法参数,就是上面泛型参数的第一个参数 ;
*/
@Override
public void initialize(IntegerValid integerValid) {
max = integerValid.max();
min = integerValid.min();
}
/**
* 第一个参数,就是泛型参数的第二个参数 ;
*
* 进行检验,返回 false 代表校验没通过,返回 true 代表校验通过
*/
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
if (null == integer) {
return false;
} else if (integer > max || integer < min) {
return false;
}
return true;
}
}
其中自定义 校验 注解 (看仔细了,不是自定义注解,是自定义检验注解) 的时候,message() ,groups() ,payload() 三个是必须有的;
其他属性根据自己需要进行添加,我这里添加了两个: min max ;
类上的注解:
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { IntegerValidImpl.class})
前三个是 java 的 元注解;
从上往下,依次是:
@Documented表示定义的注解将被包含在
javadoc中@Target定义的注解,可以使用在什么地方,这里可以使用在方法和字段上;
@Retention表示定义的注解的保存策略,这里是在运行时也保存,这样可以通过反射获取到 ;
最后一个是 javax.validation 的注解 ,表示该注解的检验规则,有哪一个类实现;
使用
@IntegerValid(min = 9,max = 12,message = "{user.id.illegal}",groups = {Second.class})
private Integer userId;
后记
没有后记,下午头疼。。
自定义注解扩展springMvc的validation注解的更多相关文章
- Spring Boot Validation,既有注解不满足,我是怎么暴力扩展validation注解的
前言 昨天,我开发的代码,又收获了一个bug,说是界面上列表查询时,正常情况下,可以根据某个关键字keyword模糊查询,后台会去数据库 %keyword%查询(非互联网项目,没有使用es,只能这样了 ...
- SpringMVC之基于注解的Controller
参考博客:https://www.cnblogs.com/qq78292959/p/3760560.html Controller注解: 传统风格的Controller需要实现Controller接口 ...
- SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- springMVC+springJDBC+Msql注解模式
最近基于Spring4.X以上的版本写了一个springMVC+springJDBC+Msql注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置. 首先我 ...
- SpringMVC使用@Valid注解进行数据验证
SpringMVC使用@Valid注解进行数据验证 from:https://blog.csdn.net/zknxx/article/details/52426771 我们在做Form表单提交的时 ...
- 基于注解的springmvc开发
原理简析 1. 背景知识:org.springframework.web.ServletContainerInitializer接口 在基于注解的servlet开发中,ServletContainer ...
- Spring SpringMVC SpringBoot SpringCloud 注解整理大全
Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...
- Spring|SpringMVC中的注解
文章目录 一.Spring注解 @Controller @ResuController @Service @Autowired @RequestMapping @RequestParam @Model ...
- 基于注解的SpringMVC
相比传统的继承Controller体系中某些类的方式,SpringMVC的注解具有以下优点: 1.Controller不再需要继承某个特定类,只是简单的POJO. 2.请求映射的配置非常方便灵活. 3 ...
随机推荐
- leetcode 61. 旋转链表
题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输 ...
- LeetCode 第 155 场周赛
一.最小绝对差(LeetCode-5189) 1.1 题目描述 1.2 解题思路 数组排好序,获取最小的差值即可. 1.3 解题代码 public class Solution { class Tes ...
- Windows 实例远程桌面报错“没有远程桌面授权服务器可以提供许可证”
参考阿里云帮助文档: https://help.aliyun.com/knowledge_detail/40859.html?spm=5176.10695662.1996646101.searchcl ...
- input标签type="file"上传文件的css样式
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Jar hell问题以及解放方法
当一个类或一个资源文件存在多个jar中,就好存在jar hell问题 可以通过以下代码来诊断问题:
- sublime text3中如何使用PHP编译系统
[WinError 2] 系统找不到指定的文件 编译错误原因,是因为编译器没有配置 第一步: 添加php可执行程序所在目录到系统环境变量(具体方法此处省略,使用本文下面的说明中的方法,此步骤可以省略 ...
- 为什么vue组件的属性,有的需要加冒号“:”,有的不用?
https://segmentfault.com/q/1010000010929963/a-1020000010930077 <tab :line-width="2" act ...
- spark ml pipeline构建机器学习任务
一.关于spark ml pipeline与机器学习一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的流 ...
- 003-结构型-02-装饰模式(Decorator)
一.概述 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator Pattern,又叫 ...
- Dart 中常用的数组操作方法总结
这里总结了一些在 Dart 中常用的数组操作方法,以便查阅. 首先,我们准备两组数据,以方便后面使用: List<Map> students = [ { 'name': 'tom', 'a ...