谷粒商城实战笔记-69-商品服务-API-品牌管理-JSR303自定义校验注解

文章目录

  • 1. 需求介绍
  • 2. 创建自定义校验注解
    • 2.1 编写自定义校验注解
      • 2.1.1 注解定义
      • 2.1.2 配置文件
  • 3. 实现自定义校验器
    • 3.1 编写自定义校验器
  • 4. 使用自定义校验
  • 5. 多类型校验器的支持
  • 6. 测试

上一节讲解了如何使用分组校验。

这一节将详细介绍如何在Java中实现自定义校验注解以及配套的校验器。

1. 需求介绍

假设我们需要校验一个名为 showStatus 的字段,该字段只能接受 01 两个值。

为了实现这一需求,我们将创建一个自定义校验注解,并为其编写相应的校验器。

2. 创建自定义校验注解

创建自定义注解的步骤:

  • ① 创建注解类
  • ② 创建提示信息配置文件
  • ③ 创建校验器
  • ④ 管理注解类和校验器

2.1 编写自定义校验注解

2.1.1 注解定义

首先,我们需要定义一个自定义的校验注解 @ListValue,并为其提供必要的元数据。

在这里插入图片描述

ListValue注解类的代码如下。

package com.atguigu.common.validator.validate;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {String message() default "{com.xunqi.common.valid.ListValue.message}";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };int[] vals() default { };}

这段代码定义了一个自定义的校验注解 @ListValue,用于在Java应用程序中对特定的值进行校验。下面是这个注解的核心部分的解释:

  1. @Constraint(validatedBy = { ListValueConstraintValidator.class }):

    • 这个元注解表明 @ListValue 是一个校验注解,并指定了一个校验器 ListValueConstraintValidator。这个校验器负责具体的校验逻辑。
  2. public @interface ListValue:

    • 定义了一个名为 ListValue 的注解接口。
  3. String message() default "{com.xunqi.common.valid.ListValue.message}":

    • message 属性定义了当校验失败时的默认错误消息。这里的默认值是一个占位符,表示错误消息将从一个配置文件中读取,通常是在 ValidationMessages.properties 文件中。
  4. Class<?>[] groups() default {}:

    • groups 属性支持分组校验,允许用户定义不同的校验组,并且可以基于这些组选择性地执行校验。
  5. int[] vals() default {}:

    • vals 属性定义了允许的值列表。这是 @ListValue 注解特有的属性,用于指定哪些整数值是合法的。

@ListValue 注解被设计用来校验一个字段或参数的值是否在一个预定义的整数列表中。

使用这个注解将调用 ListValueConstraintValidator 来验证值是否有效。

如果校验失败,则会抛出一个包含错误消息的异常,错误消息从配置文件中获取。

2.1.2 配置文件

我们还需要创建一个配置文件来定义错误消息。

# ValidationMessages.properties
com.example.validation.ListValue.message=必须提交指定的值

在这里插入图片描述

3. 实现自定义校验器

3.1 编写自定义校验器

为了执行具体的校验逻辑,我们需要实现 ConstraintValidator 接口。

package com.atguigu.common.validator.validate;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {private Set<Integer> set = new HashSet<>();/*** 初始化方法* @param constraintAnnotation*/@Overridepublic void initialize(ListValue constraintAnnotation) {int[] vals = constraintAnnotation.vals();for (int val : vals) {set.add(val);}}/*** 判断是否效验成功* @param value 需要效验的值* @param context* @return*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {//判断是否有包含的值boolean contains = set.contains(value);return contains;}}
  • initialize: 在校验开始前初始化校验器,获取允许的值列表。
  • isValid: 校验逻辑,检查给定值是否在允许的值列表中。

4. 使用自定义校验

在实体类中,我们可以使用 @ListValue 注解标记需要校验的字段。

public class BrandEntity {// ...@ListValue(values = {0, 1})private Integer showStatus;// ...
}

5. 多类型校验器的支持

如果 showStatus 字段的类型改变,例如变为 Double,我们可能需要额外的校验器来处理这种类型。在这种情况下,我们可以通过在 @ListValue 注解中指定多个校验器来解决这个问题。

@Constraint(validatedBy = {ListValueValidatorForInteger.class, ListValueValidatorForDouble.class})
public @interface ListValue {// ...
}

6. 测试

最后,我们需要确保前后端都实现了数据校验,并且能够正确处理各种情况,如分组校验和自定义校验。

  • 前端校验:确保前端能够识别错误并给出提示。
  • 后端校验:确保后端能够正确识别和处理不符合要求的数据。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

步进电机常见的三种驱动方式

步进电机是一种作为控制用的特种电机, 它的旋转是以固定的角度(称为"步距角")一步一步运行的, 其特点是没有积累误差( 为100%), 所以广泛应用于各种开环控制。 步进电机的运行要有一电子装置进行驱动, 这种装置就是步进电机驱动器, 它是把控制系统发出的脉冲信号转化…

宝塔单ip,新建多站点

报错如上&#xff1a; 那么如何新建多站点呢 先随便写个名字上去&#xff0c;然后再重新绑定别的端口… 这个时候访问99端口即可 。 如果是有域名&#xff0c;则不需要这样做 、直接80端口也可以多站点

富芮坤FR800X系列之按键检测模块设计

FR800X系列按键检测模块 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固件工程师 BLE固件工程师 文章目录 1.概要2.用户如何设计按键检测模块2.1 GPIO初始化2.2按键模块初始化2.3设计中断函数&#xff1a;2.4循环…

Florence2:Advancing a unified representation for a variety of vision tasks

Florence-2模型:开启统一视觉基础模型的新篇章_florence -2-CSDN博客文章浏览阅读1.1k次,点赞108次,收藏109次。Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是…

ArcSDE超过连接数解决方案

问题说明&#xff1a;服务器间歇性的会报连接数超限的问题&#xff0c;经常需要手动释放部分连接才能解决。之前遇到过类似的问题&#xff0c;主要是增大数据库连接数&#xff0c;同时检查死链接的情况&#xff0c;因为修改配置需要重启数据库&#xff0c;所以前期一直手动释放…

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试

文章目录 一&#xff0c;Java中上传文件到阿里云OSS1&#xff0c;整合阿里云OSS2&#xff0c;测试上传文件 二&#xff0c;Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…

初识Play Framework框架和第一个Java play web项目的创建

文章目录 初识Play Framework框架和第一个Java play web项目的创建一、简介特点架构开发流程示例代码总结 二、创建第一个Java play web项目1、下载play框架&#xff0c;配置系统环境变量(jdk的安装就不再说了) 2、检查play的版本和创建第一个play项目3、将项目通过idea或eclip…

福特汽车:总是悲喜交加时

每辆电动汽车的亏损高达6.94万美元&#xff0c;这把全美最大汽车制造商——福特汽车&#xff0c;也整不会了。 燃油车全美销量第一、电动车全美销量第二&#xff0c;销量大增的福特汽车增收不增利&#xff0c;息税前利润下滑27%至28亿美元&#xff0c; 因盈利远不及预期&#x…

【Python】pandas:查看数据(head, tail, values属性, at, iat, loc, iloc, [ ], sample)

pandas是Python的扩展库&#xff08;第三方库&#xff09;&#xff0c;为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。 pandas官方文档&#xff1a;User Guide — pandas 2.2.2 documentation (pydata.org) 帮助&#xff1a;可使用help(...)查看函数说明文…

Spring Boot:图书管理系统(一)

1.编写用户登录接口 代码&#xff1a; package com.example.demo;import jakarta.servlet.http.HttpSession; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotatio…

Linux 查找命令

目录 1. 查看二进制文件 which 2. 查看指定文件 find ​2.1 文件名查找 2.2 文件大小查找 前面学习过的 Linux 命令&#xff0c;其实质是一个个的二进制可执行程序&#xff0c;与 Windows 系统中的 .exe 文件是一个意思。 1. 查看二进制文件 which 语法&#xff1a; w…

sonar代码扫描报错:ERROR: Something went wrong storing the PDF at server side.

原因&#xff1a; URL带“/”引起的&#xff0c;去掉即可。 去掉之后成功&#xff1a;

2、从0搭建企业门户网站——云服务器租用

目录 正文 1、登录阿里云 2、进入云服务器界面 3、租用云服务器 正文 云服务器厂商很多,这里主要以阿里云服务器为主介绍云服务器的相关知识。 1、登录阿里云 阿里云官网地址 2、进入云服务器界面 登录后,点击控制台,进入主界面。

当AI遇上“近亲繁殖”:牛津剑桥Nature封面揭秘

在这个AI无所不能的时代,一项新的研究再次刷新了我们的认知边界。牛津大学、剑桥大学、帝国理工学院和多伦多大学的研究团队,携手登上《自然》杂志封面,揭露了一个令人震惊的事实:AI也可能遭遇“近亲繁殖”的问题! 更多信息,请关注微信公众号:JAVA和人工智能 “近亲繁…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧&#xff0c; 可以实现同一个ShaderGraph&#xff0c;同一个Material材质球&#xff0c; 但使用不同的Texture贴图&#xff0c;而Sprite显示不会相互覆盖。 具体实现方法如下&#xff1a; 声明Texture2D时&#xff0c;把名字命名成&#xff1a…

github-page静态网页将字符串写入github库中文本文档

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

echarts使用案例

1.配置legend icon 根据点击事件动态更换样式 <template><div ref"chart" style"width: 600px; height: 400px;"></div></template><script>import * as echarts from echarts;export default {name: EchartsExample,data(…

Canvas生成动画---显示一组彩色气泡

一、JS版本 <!--* Author: LYM* Date: 2024-07-26 13:51:47* LastEditors: LYM* LastEditTime: 2024-07-26 16:14:40* Description: Please set Description --> <!DOCTYPE html> <html> <head><title>canvas动态气泡</title><style&g…

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…

学习日志:JVM垃圾回收

文章目录 前言一、堆空间的基本结构二、内存分配和回收原则对象优先在 Eden 区分配大对象直接进入老年代长期存活的对象将进入老年代主要进行 gc 的区域空间分配担保 三、死亡对象判断方法引用计数法可达性分析算法引用类型总结1&#xff0e;强引用&#xff08;StrongReference…