Springboot--元注解及自定义注解(表单验证)
本文简单说明一下元注解,然后对元注解中的@Retention做深入的讨论,在文章最后使用元注解写一个自定义注解来结尾。
一、结论:
@Target:注解的作用目标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Retention:注解的保留位置
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
二、场景与样例
此处对@Retention做特殊说明。
RetentionPolicy.SOURCE,编译后的class文件不包含@Retention注释,使用在编译阶段,主要是在编译时做一些操作,例如:@Override和@SuppressWarnings(@Override:改注解向编译器说明被注解元素是重写的父类的一个元素。在重写父类元素的时候此注解并非强制性的,不过可以在重写错误时帮助编译器产生错误以提醒我们。比如子类方法的参数和父类不匹配,或返回值类型不同;编译通过后,方法上不再有@Override注解;@SuppressWarnings:在编译时抑制编译报错)。
RetentionPolicy.CLASS,编译后在class文件中仍然存在,但是运行时不会被JVM调用,即使是使用反射也不无法调用该注解,但是要是具体说他与RetentionPolicy.SOURCE的区别,除了是否会存在于class文件上之外,还没有找到实质性的区别(很有可能的区别是:RetentionPolicy.SOURCE仅仅是给应用层开发人员用的,RetentionPolicy.CLASS 需要应用层和底层系统开发人员配合使用的,所以仅仅是应用层开发的我们是一脸懵逼)
三、自定义注解(以自定义日期校验注解为例)
1、自定义注解
package com.example.demo.utils; import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTime {
String message() default "格式错误";
String format() default "YYYY-MM-DD";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {}; }
其中@Constraint必须添加,改注解指定自定义注解的具体实现类。
2、自定义注解实现类(校验逻辑实现类)
package com.example.demo.utils; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.ParseException;
import java.text.SimpleDateFormat; public class DateTimeValidator implements ConstraintValidator<DateTime, String> { private DateTime dateTime; @Override
public void initialize(DateTime constraintAnnotation) {
this.dateTime = constraintAnnotation;
} @Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(context == null){
return true; }
String format = dateTime.format();
if (value.length() != format.length()) {
return false;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
try {
simpleDateFormat.parse(value);
} catch (ParseException e) {
return false;
}
return true;
}
}
3、自定义注解使用
@Validated
@Controller
@RequestMapping("/test")
@Api(value = "SpringBoot测试接口2")
public class UserTestController2 { @ResponseBody
@PostMapping(value ="/validated2")
@ApiOperation(value="validated表单验证测试")
@ApiImplicitParams( {@ApiImplicitParam(paramType="query", name = "date", value = "日期", dataType = "String")})
public String validated2(@DateTime(message = "格式错误啦啦啦啦",format = "yyyy-mm-dd") String date){
return "OK";
} @ResponseBody
@PostMapping(value ="/validated3")
@ApiOperation(value="validated表单验证测试")
@ApiImplicitParams( {@ApiImplicitParam(paramType="query", name = "date", value = "日期", dataType = "String")})
public String validated3(@DateTime String date){
return "OK";
}
}
4、验证


Springboot--元注解及自定义注解(表单验证)的更多相关文章
- 看用Tornado如何自定义实现表单验证
我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言, ...
- python26:自定义form表单验证
一.自定义Form的原理 1.1 各种form表单验证比较 只有python提供了form表单验证,其他的都没有提供.django提供的功能还不够强大.最强大的是微软的ASP.NET!我们可以自己写一 ...
- lumen手记:自定义Validate表单验证
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天开始跳lumen的表单验证Validate类的坑,确实好坑!!! 首先,lumen的表单验证返回是无状态的json格式api,这... 所有开 ...
- web前端框架之自定义form表单验证
自定义form验证初试 .在后端创建一个类MainForm,并且在类中自定义host ip port phone等,然后写入方法,在post方法中创建MainForm对象,并且把post方法中的sel ...
- tornado之自定义form表单验证
直接上链接吧:银角的地址 源码下载链接:点我点我点我...
- [php基础]PHP Form表单验证:PHP form validator使用说明
在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...
- jquery validate强大的jquery表单验证插件
jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...
- SpringBoot防止重复请求,重复表单提交超级简单的注解实现
1. 注解接口 /** * @description 防止表单重复提交注解 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHO ...
- spring mvc:练习:表单验证(javaConfig配置和注解)
使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片) ...
随机推荐
- ASP.NET Core 3.x API版本控制
前言 一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发. 我们其 ...
- SpringBoot返回html页面
一般Controller返回数据或页面,今天谈一下返回页面的场景. 一.不使用template 1. controller中定义对应的访问路由及返回的页面(使用Controller,不要使用RestC ...
- 看不见远程新建git分支
再网页上新建了一个git分支.然后在本地跑git branch -r(查看远程分支)/ git branch -a(查看所有分支)两个命令,都没有看到新建的那个分支.这是为啥呢??? 原因是因为:gi ...
- Java实现 LeetCode 392 判断子序列
392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符 ...
- Java实现 蓝桥杯VIP 算法训练 阿尔法乘积
蓝桥杯–阿尔法乘积 问题描述 计算一个整数的阿尔法乘积.对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身:否则的话,x的阿尔法乘积就等于它的各位非0的 ...
- Java实现 蓝桥杯VIP 算法提高 我们的征途是星辰大海
算法提高 我们的征途是星辰大海 时间限制:1.0s 内存限制:256.0MB 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表空地,c ...
- Java实现 LeetCode 113 路径总和 II
113. 路径总和 II 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...
- java中PipedStream管道流通信详细使用(详解)
多线程使用PipedStream 通讯 Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是 类名 作用 备注 PipedInputStream 字节管道输入流 字节流 Pi ...
- java实现第六届蓝桥杯五星填数
五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...
- IDEA连接远程服务器Docker部署Spring Boot项目
开始前的准备工作 拥有一台云服务器,我的是腾讯云服务器(CentOS7) 腾讯云服务器安装Docker,我的版本是Docker 19.03.9,关于安装和配置镜像加速器可以查阅我的另一篇博文:http ...