自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析

Spring Validation

概念

在原先的编码中,我们如果要验证前端传递的参数,一般是在接受到传递过来的参数后,手动在代码中做 if-else 判断,这种编码方式会带来大量冗余代码,十分的不优雅。
因此,推出了用注解的方式,来代替手动判断的方式,让编码更加的简洁。

使用方式

引入注解:
一般在

        org.springframework.boot            spring-boot-starter-web        

依赖中会有相关依赖,如果没有的话,可以手动引入下面的依赖。

    org.hibernate.validator      hibernate-validator      6.0.18.Finalcompile

get

针对 get 方式的请求,我们的请求参数直接放在参数列表里,因此直接在参数列表里加上想要验证的注解即可。

  @GetMapping("xss")    public void xssGet(@RequestParam("xss1") @Size(min = 1,max = 15,message = "长度不对") String xss, HttpServletRequest request) {          }

在方法中,需要验证 xss 参数是否符合长度规范,即长度在 1-15 个字符之间,如果不对,则会提示出信息:长度不对。

bb357fb508c3855394a4bdfe5c128012.png

post

在 post 方法中,传递的参数一般比较多,因此大多数情况下,采用的是传递的实体类的形式,然后用 json 的形式来传递数据,在这种情况下,使用的方式为构建一个实体类,然后在实体类的属性上添加注解来做。

@Datapublic class SaveEmployeeParam implements Serializable {    private static final long serialVersionUID = 8176094330224588795L;    @NotEmpty    private String Id;    @Size(max = 15, message = "名称必填,且最多为15个汉字")    private String nickname;    @PhoneValidationAnnotation    private String phone;}    @PostMapping    public ResultEntity saveEmployee( @Valid @RequestBody SaveEmployeeParam saveEmployeeParam) {        employeeService.saveEmployee(saveEmployeeParam);        return ResultEntity.success();    }

通过该方式,在验证 SaveEmployeeParam 时,框架就会自动在接受参数时,验证实体类中的值是否符合注解定义的规范。
在这里,就会验证 id 不能为空,nickname 的长度最多15个字符,以及我在手机号上添加了一个自定义注解,在确保其符合手机号规范。

分组校验

有时,我们的一个实体类可能会在多种情况下使用,而又不想每种情况都定义一个实体类,则可以采用分组校验的方式,在不同的情况下,采用不同的校验方案。
首先自定义几种不同情况下的接口:

public interface Create {}public interface Update {}


然后在指定的 pojo 上指定不同的情况下的策略:

@Datapublic class Demo {    @Size(max = 15, groups = Create.class)    @Size(max = 10, groups = Update.class)    private String name;        @Max(value = 100, groups = Create.class)    @Max(value = 20, groups = Update.class)    private Integer age;}


最后,在不同的方法上,根据业务需要指定使用不同的策略即可:

    @PostMapping("xss3")    public String xssPost(@Validated({Create.class}) @RequestBody Demo xss3) {        return JSON.toJSONString(xss3);    }    @PutMapping("xss4")    public String xssUpdate(@Validated({Update.class}) @RequestBody Demo xss4) {       return JSON.toJSONString(xss4);    }

在这种情况下,则在执行 xssPost() 方法时,采用是 Create 的执行方案,在执行 xssUpdate() 方法时,采用的是 Update 方案。

提供的全部注解

JSR提供的校验注解:@Null必须为 null@NotNull必须不为 null@AssertTrue必须为 true@AssertFalse必须为 false@Min(value)大于等于 给定数字@Max(value)小于等于 给定数字@DecimalMin(value)大于等于 给定数值@DecimalMax(value)小于等于 给定数字@Size(max=, min=)集合或字符串长度在指定范围内@Digits指定整数部分和小数部分可以接受的最大位数@Past必须为一个过去的时间@Future必须为一个未来的时间@Pattern(regex=,flag=)给定字符串符合正则表达式Hibernate Validator提供的校验注解@NotBlank(message =)非 null,且长度必须大于 0@Email符合电子邮箱规范@Length(min=,max=)字符串长度在给定范围内@NotEmpty字符串或集合 非空@Range(min=,max=,message=)数字或字符串表示的数字在指定范围内

自定义

当业务需要一些官方没有提供的校验类型的话,为了方便,我们就需要考虑使用自定义注解的形式了。
这里,我们采用手机号的形式来演示一下,首先我们自定义一个注解:

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {PhoneValidation.class})public @interface PhoneValidationAnnotation {    String message() default "手机号不符合规范格式";}


在代码中,我们定义了默认的错误提示信息。
然后,我们写一个实现类,来具体实现注解所要表达的含义:

public class PhoneValidation implements ConstraintValidator {    String phonePattern;    Pattern compile;    @Override    public void initialize(PhoneValidationAnnotation constraintAnnotation) {        phonePattern = "1[3456789]d{9}";        compile = Pattern.compile(phonePattern);    }    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        return compile.matcher(value).matches();    }}

在代码中,我们创建了一个类,实现 ConstraintValidator 接口,并重写其的初始化方法和验证方法,这样,在验证参数的时候,其就会自动调用相关的方法来验证传递的是否正确。

// 注解:要校验的数字在给定的集合中// 定义接口@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {EnumValidation.class})public @interface EnumValidationAnnotation {    long[] limitValue() default {};}// 具体实现public class EnumValidation implements ConstraintValidator {    private long[] longValues;    @Override    public void initialize(EnumValidationAnnotation constraintAnnotation) {        longValues = constraintAnnotation.limitValue();    }    @Override    public boolean isValid(Long value, ConstraintValidatorContext context) {        for (long longValue : longValues) {            if (value == longValue) {                return true;            }        }        return false;    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql开源许可_为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库,最近改变了代码授权,放弃了 Apache 许可证。一、CockroachDB 的许可证变更CockroachDB 以前的许可证是 Apache,代码托管在 GitHub,任何人都可以访问。现在的许可证改成了"商业源码许可…

Spring 依赖注入的实现

依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。 当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new…

java 静态对象语法_04.Java 语法

计算机基础知识表达式(expression):Java中最基本的一个运算。比如一个加法运算表达式。12是一个表达式,ab也是。计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000~1111…

Spring实例化Bean

在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象。在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。 构造器实例化 构造器实例化是指 Spring 容器通…

Spring基于XML装配Bean

Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式。Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配、基于 Annotation 的 Bean 装配和自动装配等。 Spring 基于 XML 的装配通常采用两种实现方式&…

苹果php环境,苹果电脑安装PHP环境步骤-PHP问题

苹果电脑装置PHP环境步骤:一、起首咱们需求装置Homebrew二、终端输出饬令// 创立目次,假如你不创立过该目次sudo mkdir /usr/local/varsudo chmod 777 /usr/local/var//修正成你本人的用户名以及组,假如你不创立过该目次sudo mkdir /usr/local/sbin/sudo chown -R :…

Spring基于Annotation装配Bean

在 Spring 中,尽管使用 XML 配置文件可以实现 Bean 的装配工作,但如果应用中 Bean 的数量较多,会导致 XML 配置文件过于臃肿,从而给维护和升级带来一定的困难。 Java 从 JDK 5.0 以后,提供了 Annotation(注…

swiper鼠标hover停止自动轮播_swiper滑块组件

相信大家在平常购物的时候都会看到轮播图,轮播图里面播放的是热门商品的信息。在小程序里面我们可以通过swiper滑动视图容器组件来实现,让我们一起来看下swiper组件都有哪些属性:我们看到可以通过一些属性给视图容器增加一些指示点&#xff0…

Spring自动装配Bean

除了使用 XML 和 Annotation 的方式装配 Bean 以外,还有一种常用的装配方式——自动装配。自动装配就是指 Spring 容器可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中。 要使用…

java鬼剑士觉醒,DNF新觉醒装扮,男鬼剑士帅气无比!

在DNF这个游戏中,时装作为游戏的一大氪点,相信这几天的奇迹缝纫机活动也让大家了解到了时装到底多么的烧钱!而也因为这次的活动,时装可以说达到了饱和状态了,估计短时间之内魔盒里不会再出现追忆时装了!虽然…

Spring JDK动态代理

JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的。下面通过具体的案例演示 JDK 动态代理的使用。 1. 创建项目 在 MyEclipse 中创建一个名称为 spring 的 Web 项目,将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中,…

澄海哪里学机器人编程_少年学机器人编程

​当今社会,唯有能者居之,说的是有技能在手的人可以立足于职场,格物斯坦表示:现代化的教育方式有很多,其中有一种机器人编程教育模式,青少年们学好了,以后中考、高考核就业比同龄人更有优势了。…

Spring CGLlB动态代理

JDK 动态代理使用起来非常简单,但是有一定的局限性,这是因为 JDK 动态代理必须要实现一个或多个接口,如果不希望实现接口,则可以使用 CGLIB 代理。 CGLIB(Code Generation Library)是一个高性能开源的代码…

更新fielddata为true_在pytorch中停止梯度流的若干办法,避免不必要模块的参数更新...

在pytorch中停止梯度流的若干办法,避免不必要模块的参数更新2020/4/11 FesianXu前言在现在的深度模型软件框架中,如TensorFlow和PyTorch等等,都是实现了自动求导机制的。在深度学习中,有时候我们需要对某些模块的梯度流进行精确地…

php 自动切图,前端工程师技能之photoshop巧用系列扩展篇自动切图

目录[1]初始设置 [2]自动切图前面的话随着photoshop版本的不断升级,软件本身增加了很多新的功能,也为切图工作增加了很多的便利。photoshop最新的版本新增了自动切图功能,本文将详细介绍photoshop的这个新功能初始设置当然首先还是要进行一些…

Spring通知类型及使用ProxyFactoryBean创建AOP代理

Spring 通知类型 通知(Advice)其实就是对目标切入点进行增强的内容,Spring AOP 为通知(Advice)提供了 org.aopalliance.aop.Advice 接口。 Spring 通知按照在目标类方法的连接点位置,可以分为以下五种类型…

matlab二维谐振子,基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急...

基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急0____丿呆呆丶2017.04.15浏览20次分享举报tic clc clear L20; W20; N20; M20; hxL/(2*N); hyW/(2*M); Szeros((2*M-1)*(2*N-1)); for m1:2*M-1 D…

typescript get方法_.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式。许多工具都能生成C#类图,有些工具也…

Spring使用AspectJ开发AOP

AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言。Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 AspectJ 方式开发 AOP。 使用 AspectJ 开发 AOP 通常有两种方式: 基于 …

matlab特征方程的根,MATLAB 求解特征方程的根轨迹图稳定性分析

原文:http://tecdat.cn/?p3871根轨迹分析在下文中,我们提供了用于根轨迹分析的强大MATLAB命令的简要描述。读者可能想知道为什么当强大的MATLAB命令可用时,教师强调学习手工计算。对于给定的一组开环极点和零点,MATLAB立即绘制根…