当前位置: 首页 > news >正文

我写了一套无敌的参数校验组件③ | SpEL Validator 之自定义约束注解

前言

SpEL Validator 是一个强大的 Java 参数校验包,基于 SpEL 实现,扩展自 javax.validation 包,用于简化参数校验,几乎支持所有场景下的参数校验。

GitHub地址:https://github.com/stick-i/spel-validator

这是一套全新的参数校验组件,并非造轮子。看完本文你可能会觉得用不上或不屑于使用,但这玩意确实有应用场景,你不妨稍微留意一下,日后你总会发现有用得上的地方。

Tips:此乃系列文章,当前为第③篇

本篇只讲如何进行自定义约束注解,对此框架不太了解的朋友可以先看看介绍文章,地址:SpEL Validator 使用指南

系列文章地址:SpEL Validator

自定义约束注解

如果你使用过 javax.validation 的自定义约束注解,那么你会发现 SpEL Validator 的自定义约束注解几乎与 javax.validation 一致。

下面以 @SpelNotBlank 为例,展示如何实现自定义约束注解。

创建约束注解类

每个约束注释必须包含以下属性:

  • String message() default ""; 用于指定约束校验失败时的错误消息。可以定义默认值,后续会支持多语言配置。
  • String condition() default ""; 用于指定约束开启条件的SpEL表达式,只有满足条件的情况下才会对标记的元素进行校验。
  • String[] group() default {}; 用于指定分组条件的SpEL表达式。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Repeatable(SpelNotBlank.List.class)
public @interface SpelNotBlank {String message() default "不能为空字符串";String condition() default "";String[] group() default {};@Target(FIELD)@Retention(RUNTIME)@Documented@interface List {SpelNotBlank[] value();}}

如果你创建的约束注解类需要其他的字段进行辅助判断,也可以自己加上。

创建约束验证器

创建类 SpelNotBlankValidator,实现 SpelConstraintValidator<T> 接口,其中泛型 T 为要校验的约束注解类,在这里是 SpelNotBlank

实现 isValid 方法,校验逻辑在该方法中实现。

isValid 方法的参数说明如下:

  • annotation:当前约束注解的实例。
  • obj:当前校验的根对象。
  • field:当前校验的字段。
public class SpelNotBlankValidator implements SpelConstraintValidator<SpelNotBlank> {@Overridepublic FieldValidResult isValid(SpelNotBlank annotation, Object obj, Field field) throws IllegalAccessException {CharSequence fieldValue = (CharSequence) field.get(obj);return new FieldValidResult(StringUtils.hasText(fieldValue));}}

一般情况下,只需要校验当前字段的值,通过 field.get(obj) 即可获取。

有些约束注解可能仅支持特定类型的字段,可以通过重写 supportType() 方法来指定支持的类型。默认情况下,支持所有类型。

NotBlank一般是只支持字符类型的,所以这里返回 CharSequence.class

public class SpelNotBlankValidator implements SpelConstraintValidator<SpelNotBlank> {@Overridepublic FieldValidResult isValid(SpelNotBlank annotation, Object obj, Field field) throws IllegalAccessException {CharSequence fieldValue = (CharSequence) field.get(obj);return new FieldValidResult(StringUtils.hasText(fieldValue));}private static final Set<Class<?>> SUPPORT_TYPE = Collections.singleton(CharSequence.class);@Overridepublic Set<Class<?>> supportType() {return SUPPORT_TYPE;}}

关联注解和验证器

SpelNotBlank 注解上添加 @SpelConstraint 注解,指定该注解的验证器为 SpelNotBlankValidator

@Documented
@Retention(RUNTIME)
@Target(FIELD)
@Repeatable(SpelNotBlank.List.class)
@SpelConstraint(validatedBy = SpelNotBlankValidator.class) // 关联验证器
public @interface SpelNotBlank {// ...
}

使用自定义约束注解

完成上面的步骤,就可以在需要校验的字段上使用 @SpelNotBlank 注解了,使用方法和内置的约束注解没什么两样:

@Data
@SpelValid // 添加启动注解
public class SimpleExampleParamVo {@NotNullprivate Boolean switch;@SpelNotBlank(condition = "#this.switch == true")private String audioContent;}

这样你就成功创建了一个自定义约束注解啦!

总结

创建自定义约束注解的步骤:

  1. 创建约束注解类,定义注解属性
  2. 创建约束验证器,实现验证逻辑,并设置支持的类型
  3. 关联注解类和验证器
  4. 使用与测试

OK兄弟们,如果你能看到这里,说明你对这个组件还算有点兴趣,不妨到GitHub给它点个star,或者给我点个关注,以便于持续关注项目更新动向,谢谢你的支持~~

GitHub地址:https://github.com/stick-i/spel-validator


http://www.mrgr.cn/news/29579.html

相关文章:

  • 将Docker中nginx静态资源目录映射到宿主机的某个目录及配置文件映射到宿主机
  • Visual Studio 2022 安装
  • 开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究
  • 【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回
  • Spring中的 bean 标签中的 factory-bean , factory-method
  • 前端基础的讲解-JS(10)
  • 传输层协议——udp/tcp
  • 静态绑定和动态绑定
  • Flutter Android Package调用python
  • SOLIDWORKS® 2025 新增功能 - SIMULATION
  • 函数题 6-12 判断奇偶性【PAT】
  • 【Vue】- 路由及传参
  • 利用WPF绘制轮廓并保存为图片
  • 文件保护措施:防止文件误删、覆盖及恶意篡改的策略探讨
  • c++设计模式
  • 珠海市自闭症寄宿学校,为孩子打造温馨成长环境
  • python队列操作
  • 李沐也看好的方向:多模态预训练!最新成果刷爆SOTA,轻松拿下顶会
  • arm
  • 蚂蚁在 RAG 与向量检索上的实践:技术应用与创新分析
  • 新书出版,大陆首本NestJS图书《NestJS全栈开发解析:快速上手与实践》
  • SDKMAN!软件开发工具包管理器
  • JS全选反选案例
  • 组合式 API 和选项式 API的区别
  • VulhubDC-4靶机详解
  • EtherCAT 转 Profinet 网关在深海钻探工作中的作用