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

自定义注解使用

现象:

自定义注解使用

方法:

1:元注解
java.lang.annotation 下定义了元注解

  • @Documented 文档相关 标注了此注解则会包含在javadoc文档中
  • @Retention 指定注解生命周期
  • @Target 指定注解作用范围
  • @Inherited 指定子类可以继承父类的注解
  • @Native 指定字段是常量
  • @Repeatable 指定在一个地方可以重复使用同一个注解

2:元注解 @Retention 生命周期

  • SOURCE: 只保留在源文件
  • CLASS: 保留到class文件
  • RUNTIME: 运行时也存在

3:元注解 @Target 作用范围

  • TYPE——接口、类、枚举、注解
  • FIELD——字段、枚举的常量
  • METHOD——方法
  • PARAMETER——方法参数
  • CONSTRUCTOR ——构造函数
  • LOCAL_VARIABLE——局部变量
  • ANNOTATION_TYPE——注解
  • PACKAGE——包,用于记录java文件的package信息

4:新建java类选择注解@Annitation

在这里插入图片描述

5:示例建立MyAnnitation注解

在这里插入图片描述
6:使用:
在这里插入图片描述

二:实例使用:

需求:自定义注解校验请求参数只能是指定值
比如 请求接口 type 参数 只能是"1"、“2”、“3”

方法:
1:引入validation校验jar包

   <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

2:建立自定义注解
自定义注解范围 :字段、枚举的常量、方法参数
使用@Constraint 指定校验逻辑的类

@Target({ElementType.PARAMETER,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = EnumRangeValidator.class)
public @interface CheckEnum {// 校验能输入的值String[] rang();// 错误提示String message() default "输入的内容不在规定范围";// 名称固定参数:校验分组信息Class<?>[] groups() default {};// 名称固定参数:加载的负载Class<? extends Payload>[] payload() default {};}

3:建立校验逻辑的类EnumRangeValidator


public class EnumRangeValidator implements ConstraintValidator<CheckEnum,String> {private String[] range;@Overridepublic void initialize(CheckEnum constraintAnnotation) {// 初始化将注解中的枚举内容放数组rangerange=constraintAnnotation.rang();}@Overridepublic boolean isValid(String request, ConstraintValidatorContext constraintValidatorContext) {// 判断输入的值在不在 注解设置的范围if(StringUtils.isNotBlank(request)){if(range!=null && range.length>0){return Arrays.asList(range).contains(request);}}return false;}
}

4:全局异常监听控制返回
这里简单返回String 实际开发中应该定义全局返回对象

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler<T> {@ResponseBody@ResponseStatus(HttpStatus.OK)@ExceptionHandler({MethodArgumentNotValidException.class})private String argumentsNotValid(MethodArgumentNotValidException e) {try {var fieldError = e.getBindingResult().getFieldError();var defaultMessage = fieldError.getDefaultMessage();log.error("参数校验不通过 ", e);return defaultMessage;} catch (NullPointerException exception) {log.error("fieldError 为空", e);return "参数异常";}}@ResponseBody@ResponseStatus(HttpStatus.OK)@ExceptionHandler(ConstraintViolationException.class)private String multiArgumentNotValid(ConstraintViolationException e) {var constraintViolations = e.getConstraintViolations();var reduce =constraintViolations.stream().map(ConstraintViolation::getMessage).reduce((x, y) -> x + " " + y).orElse("");log.error("参数校验不通过 ", e);return reduce;}
}

5:请求入参对象EnumValidRequest

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnumValidRequest {/*** @NotBlank 不能为空校验*/@NotBlank(message = "id不能为空!")private String id;private String name;/*** 设置类型  值只能是1、2、3* 使用自定义枚举校验 类型只能传值1、2、3*/@CheckEnum(rang = {"1","2","3"})private String type;
}

6:请求接口test/check/enum
使用定义的EnumValidRequest 作为参数

@Slf4j
@RestController
@RequestMapping("/test")
@Validated
public class RequestController {@PostMapping("/check/enum")public String getA(@Valid @RequestBody EnumValidRequest request){log.debug("a请求执行:{}",request);return "A";}}

7:启动项目 访问接口test/check/enum

  • 输入的type不在范围时返回:
    在这里插入图片描述
  • 不传id时返回:
    在这里插入图片描述
  • 正常参数访问返回:
    在这里插入图片描述

相关文章:

自定义注解使用

现象&#xff1a; 自定义注解使用 方法&#xff1a; 1&#xff1a;元注解 java.lang.annotation 下定义了元注解 Documented 文档相关 标注了此注解则会包含在javadoc文档中Retention 指定注解生命周期Target 指定注解作用范围Inherited 指定子类可以继承父类的注解Native …...

2023年全国最新高校辅导员精选真题及答案42

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 89.侵犯行为是一种故意伤害他人的行为&#xff0c;一般包括了动机、行为和后果。 答案&a…...

Python模拟星空

文章目录前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字模拟星空模拟星球浪漫星空尾声前言 Python模拟星空&#xff0c;你值得拥有&#xff01;uu们一周不见啦&#xff0c;本周博主参考网上大佬们的星空&#xff0c;给大家带来了属于…...

IDE集成开发工具-IDEA(一)之IDE的概念

IDE的概念 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开…...

基于Java+Springboot+vue的汽车租赁系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、…...

【笔记】关于Maven中<optional>标签的理解

之前我有个误区&#xff1a;子pom通过<parent>标签继承父pom&#xff0c;如果父pom中的依赖设置<optional>true</optional> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version&g…...

JavaScript函数及面向对象

JavaScript函数及面向对象 4.1、函数定义及变量作用域 定义方式一 绝对值函数 function abs(x){if(x>0){return x;}else{return -x;} }一旦执行到return代表函数结束&#xff0c;返回结果&#xff01; 如果没有执行return&#xff0c;函数执行完也会返回结果&#xff0c;…...

【chartGPT】我们要不要搞chartGPT?

话题:官兔子并未表态要研发chartGPT&#xff0c;chartGPT炒的很火&#xff0c;我们到底要不要投入研发呢&#xff1f; 问题起因:我个人是做技术的&#xff0c;也玩炒股。就昨天吧&#xff0c;看到一个热评【马斯克等呼吁暂停chartGPT5的研发&#xff0c;周鸿炜谈不发展才是最大…...

java——date时间类型操作

目录 1.date类型使用 2.获取想要的自定义时间点 3.date类型与String类型转换 4.date时间先后比较 1.date类型使用 在java中&#xff0c;日期时间用java.util.Date类来表示&#xff0c;调用默认构造器Date()&#xff0c;将会创建一个当前系统时间的Date对象&#xff0c;时间…...

应急响应——IDSIPSmsf流量后门分析

目录 0x01 网页篡改与后门攻击防范应对指南 0x02 主要需了解:日志存储,Webshel检测,分析思路等...

项目二:电子骰子

项目二&#xff1a;电子骰子 文章目录项目二&#xff1a;电子骰子一、导入(5分钟&#xff09;学习目的二、新授(65分钟)1.预展示结果(5分钟)2.本节课所用的软硬件(5分钟)3.硬件介绍(1分钟)4.图形化块介绍(1分钟)5.单个模块的简单使用(1分钟)6.电子骰子编程逻辑分析(25分钟)7.电…...

D. Genius‘s Gambit(很多情况)

Problem - D - Codeforces 已知三个整数a b k。求两个二进制整数z和y ( > y)满足1. y都由a个0和b个1组成;2. X - y(也是二进制形式)恰好有k个1。z和y不允许使用前导零。输入唯一的一行包含三个整数a, b和k (0 <a;1 <b;0<k < ab< 2- 105) -结果中0、1和1的个数…...

jsp824汽车维修保养管理系统javaEE+mysql

主要实现 1&#xff0e;车主信息管理&#xff1a;管理员发布车主信息后&#xff0c;普通用户查询到该车主信息&#xff0c;用户选择某个车主信息&#xff0c;查询车主信息&#xff0c;管理员审核添加&#xff0c;或删除车主信息。 2&#xff0e;保养信息管理&#xff1a;管理员…...

Linux下C/C++ redis协议(RESP)解析

Redis是一个开源的内存键值数据存储&#xff0c;最常用作主数据库、缓存、消息代理和队列。Redis提供了亚毫秒的响应时间&#xff0c;在游戏、金融科技、广告技术、社交媒体、医疗保健和物联网等行业实现了快速而强大的实时应用。 Redis连续五年成为开发人员最喜爱的数据库。开…...

IDEA 性能优化设置

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; “ 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;…...

蓝桥杯刷题冲刺 | 倒计时4天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;倒计时4天&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01;&#x1f43e; 文章目录1.整除序列2.走方格3.前缀和4.差分矩阵5.翻硬币1.整除序列 题目 链接&#xff1a; 2065. 整除序列 - Ac…...

阿里测试7年经验,从功能测试到自动化测试,我整理的超全学习指南

做测试七年多&#xff0c;有不少人问过我下面问题&#xff1a; 现在的手工测试真的不行了吗&#xff1f;测试工程师&#xff0c;三年多快四年的经验&#xff0c;入门自动化测试需要多久&#xff1f;自学自动化测试到底需要学哪些东西&#xff1f;不得不说&#xff0c;随着行业的…...

jar加密后当作SDK给别人使用(可maven引入)

1、不加密jar&#xff0c;进行提取公共代码&#xff0c;打成jar包&#xff0c;并用maven引入 参考文章&#xff1a;以maven添加依赖的方式导入自己写的项目。springboot 提取公共类&#xff0c;多服务共用 2、加密jar&#xff0c;使用ClassFinal进行jar的加密 官网地址:Clas…...

【编程基础】032、C语言中结构体在解题中的应用

文章目录C语言中结构体在解题中的应用1、结构体之时间设计2、结构体之成绩记录3、结构体之成绩统计2C语言中结构体在解题中的应用 1、结构体之时间设计 题目描述 定义一个结构体变量&#xff08;包括年、月、日&#xff09;。计算该日在本年中是第几天&#xff0c;注意闰年问…...

Kotlin 是后端开发的未来

Kotlin 是后端开发的未来 严格类型、命名参数、多范式语言 您今天遇到的每个后端开发人员都会说他们使用 JavaScript、Python、PHP 或 Ruby 编写代码。近年来&#xff0c;您会遇到一小部分人转而使用 Kotlin 作为他们创建 Web 服务器的语言选择。由于我在学习Ktor&#xff0c;所…...

Vue3学习笔记(9.1)

Vue.js style&#xff08;内联样式&#xff09; 我们可以在v-bind:style直接设置样式&#xff0c;可以简写:style <!--* Author: RealRoad1083425287qq.com* Date: 2023-04-02 19:41:53* LastEditors: Mei* LastEditTime: 2023-04-03 15:41:44* FilePath: \vscode\Vue3_li…...

MinIO 环境变量泄漏漏洞(CVE-2023-28432)

漏洞描述 MinIO 是一个开源的对象存储服务器。 MinIO RELEASE.2023-03-20T20-16-18Z之前版本中的 bootstrap-peer-server.go#VerifyHandler 方法存在敏感信息泄漏漏洞&#xff0c;攻击者可向集群部署中的 MinIO 服务器的 /minio/bootstrap/v1/verify API发送POST请求&#xf…...

数组转字符串、字符串转数组的方法

一.数组转字符串方法 方法转化后类型用法特点toString()string将数组转换成了一个字符串默认用","隔开toLocaleString()string把数组转换成本地约定的字符串默认用","隔开join()string将数组元素连接起来以构建一个字符串 默认用","隔开 可以随…...

local fault和remote fault

1、什么是 local fault和remote fault? 在IEEE802.3协议中&#xff0c;local fault和remote fault是一种错误序列&#xff0c;在PCS层定义。 MAC RX侧收到local fault时&#xff0c;意味本地链路没有正常建立链路&#xff0c;MAC RX侧收到remote fault时&#xff0c;意味对端没…...

二叉树搜索树 AVL树

文章目录1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树操作1.3 二叉搜索树的实现1.4 二叉搜索树的应用1.5 二叉搜索树的性能分析2. AVL 树2.1 AVL树的概念2.2 AVL树节点的定义2.3 AVL树的插入2.4 AVL树的旋转2.5 AVL树的验证2.7 AVL树的性能3. 具体代码实现区3.1 二叉搜索树的…...

nginx配置代理多个前端资源

log: 背景 两套不同的前端使用同一个后端服务&#xff0c;前端使用的Nginx代理的dist包 前端 vueelementui 后端 Pythonflask Nginx代理设置 1.进入Linux机器&#xff0c;whereis nginx 查看Nginx安装位置 2.进到Nginx配置文件下 3.vim nginx.conf 通过多个server管理…...

SuperMap iServer下载安装,启用服务,以及发布服务

supermap 是一套专注于 GIS 产品开发的全过程解决方案&#xff0c;主要包括桌面 GIS 、云 GIS 和 Web SDK&#xff0c;这里主要介绍如何使用它的云服务器 iServer 进行三维地图及数据服务的发布&#xff0c;iServer 里面还可进行负载均衡、集群等高级配置&#xff0c;有兴趣的可…...

vxe-table简单使用 vue vxe-table vue整合vxe-table vue2 vxe-table 简单使用

vxe-table简单使用 vue vxe-table vue整合vxe-table vue2 vxe-table 简单使用安装vxe-table引用使用安装vxe-table vue2稳定版本 vue3稳定版本 npm install xe-utils vxe-tablelegacy安装 vxe-table 依赖的插件 npm i xe-utils引用 我这边是全局引入&#xff0c;可以根据自…...

Vue项目的打包上线步骤

Vue项目的打包上线步骤一、打包之前的路由模式二、性能分析和CDN的应用2.1 性能分析2.2 webpack排除打包2.3 CDN文件配置2.4 注入CDN文件到模板一、打包之前的路由模式 两种路由模式 hash模式 &#xff1a; #后面是路由路径&#xff0c;特点是前端访问&#xff0c;#后面的变化不…...

都2023了,学习自动化测试还有必要么?会不会浪费我时间

最近收到不少小伙伴私信提问&#xff0c;其中问得比较多的就是“学习自动化测试有那么重要吗&#xff1f;”。 我的回答是肯定的——很重要。 相信不少同学都有诸如此类的疑问&#xff0c;例如&#xff1a;“日常工作中好像用不上自动化&#xff1f;”、“手工点点点好像也可…...