Spring Boot:自定义注解--annotation

目录

  • 自定义注解的定义和作用范围
  • 如何创建自定义注解
    • 创建注解接口
  • 如何使用自定义注解进行数据验证
    • 创建注解处理器
    • 控制器中使用注解
  • 如何为字段添加注解

自定义注解的定义和作用范围

  • 自定义注解可以作用在类、方法、属性、参数、异常、字段或其他注解上。

如何创建自定义注解

创建注解接口

在这里插入图片描述

package hanshuhuan.test.anonotion;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 实体检验自定义注解类,根据我们自定义的注解去检查实体各个字段是否在规定的值内* @author shuhu**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateEntity {public boolean required() default false;//是否检验nullpublic boolean requiredLeng() default false;//是否检验长度public boolean requiredMaxValue() default false;//是否检验最大值public boolean requiredMinValue() default false;//是否检验最小值public int maxLength() default -1;//最大长度public int minLength() default -1;//最小长度public long maxValue() default -1;//最大值public long minValue() default -1;//最小值public String errorRequiredMsg() default "";//值为null时的错误提示信息public String errorMinLengthMsg() default "";//最小长度不满足时的提示信息public String errorMaxLengthMsg() default "";//最大长度不满足时的提示信息public String errorMinValueMsg() default "";//最小值不满足时的提示信息public String errorMaxValueMsg() default "";//最大值不满足时的提示信息
}

如何使用自定义注解进行数据验证

创建注解处理器

package hanshuhuan.test.util;import java.lang.reflect.Field;import hanshuhuan.test.anonotion.ValidateEntity;
import hanshuhuan.test.bean.CodeMsg;/*** 验证实体工具类* @author shuhu**/
public class ValidateEntityUtil {public static CodeMsg validate(Object object){Field[] declaredFields = object.getClass().getDeclaredFields();for(Field field : declaredFields){ValidateEntity annotation = field.getAnnotation(ValidateEntity.class);if(annotation != null){if(annotation.required()){//表示该字段是必填字段field.setAccessible(true);try {Object o = field.get(object);//首先判断是否为空if(o == null){CodeMsg codeMsg = CodeMsg.VALIDATE_ENTITY_ERROR;codeMsg.setMsg(annotation.errorRequiredMsg());return codeMsg;}//到这,说明该变量的值不是null//首先判断是不是String类型if(o instanceof String){//若是字符串类型,则检查其长度if(annotation.requiredLeng()){if(o.toString().length() < annotation.minLength()){CodeMsg codeMsg = CodeMsg.VALIDATE_ENTITY_ERROR;codeMsg.setMsg(annotation.errorMinLengthMsg());return codeMsg;}if(o.toString().length() > annotation.maxLength()){CodeMsg codeMsg = CodeMsg.VALIDATE_ENTITY_ERROR;codeMsg.setMsg(annotation.errorMaxLengthMsg());return codeMsg;}}}//其次来判断是否为数字if(isNumberObject(o)){//判断是否规定检查最小值if(annotation.requiredMinValue()){if(Double.valueOf(o.toString()) < annotation.minValue()){CodeMsg codeMsg = CodeMsg.VALIDATE_ENTITY_ERROR;codeMsg.setMsg(annotation.errorMinValueMsg());return codeMsg;}}//判断是否规定检查最大值if(annotation.requiredMaxValue()){if(Double.valueOf(o.toString()) > annotation.maxValue()){CodeMsg codeMsg = CodeMsg.VALIDATE_ENTITY_ERROR;codeMsg.setMsg(annotation.errorMaxValueMsg());return codeMsg;}}}} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}return CodeMsg.SUCCESS;}/*** 检查对象是否是数字类型* @param object* @return*/public static boolean isNumberObject(Object object){if(object instanceof Integer)return true;if(object instanceof Long)return true;if(object instanceof Float)return true;if(object instanceof Double)return true;return false;}
}

控制器中使用注解

@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> login(User user,String cpacha){if(user == null){return Result.error(CodeMsg.DATA_ERROR);}//用统一验证实体方法验证是否合法CodeMsg validate = ValidateEntityUtil.validate(user);if(validate.getCode() != CodeMsg.SUCCESS.getCode()){return Result.error(validate);}//表示实体信息合法,开始验证验证码是否为空if(StringUtils.isEmpty(cpacha)){return Result.error(CodeMsg.CPACHA_EMPTY);}log.info("ok"+user);return Result.success(true);
}

如何为字段添加注解

  • 自定义注解的定义是通过@注解名的方式实现的。
@ValidateEntity(required=true,requiredLeng=true,minLength=4,maxLength=18,errorRequiredMsg="用户名不能为空!",errorMinLengthMsg="用户名长度需大于4!",errorMaxLengthMsg="用户名长度不能大于18!")
@Column(name="username",nullable=false,length=18)
private String username;//用户名@ValidateEntity(required=true,requiredLeng=true,minLength=4,maxLength=32,errorRequiredMsg="密码不能为空!",errorMinLengthMsg="密码长度需大于4!",errorMaxLengthMsg="密码长度不能大于32!")
@Column(name="password",nullable=false,length=32)
private String password;//密码

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

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

相关文章

Google AdSense 账户开通网站广告位后如何配置付款电汇账号的详细教程!

本篇文章主要讲解&#xff1a;Google AdSense 账户开通网站广告位后如何配置付款电汇账号的详细教程。通过本文章可以快速了解开通账户配置权限的整体流程&#xff0c;很多小白朋友注册完毕后发现根本没有配置账号的入口&#xff0c;这篇文章能够告诉你详细的原有。 日期&#…

知识增强语言模型提示 零样本知识图谱问答10.8+10.11

知识增强语言模型提示 零样本知识图谱问答 摘要介绍相关工作方法零样本QA的LM提示知识增强的LM提示与知识问题相关的知识检索 实验设置数据集大型语言模型基线模型和KAPIN评估指标实现细节 实验结果和分析结论 摘要 大型语言模型&#xff08;LLM&#xff09;能够执行 零样本cl…

CAN和CANFD通信介绍

CAN&#xff08;Controller Area Network&#xff0c;控制器局域网&#xff09;是一种串行通信技术&#xff0c;专门用于在汽车电子控制单元&#xff08;ECU&#xff09;之间实现可靠的数据交换。 CAN协议介绍 电子化 汽车近年来的发展呈现出以电子化为主的特点。电子化的主…

Lab 1: Unix utilities汇总

这个实验主要学习了常用的一些系统调用。 Lab 1: Unix utilities Boot xv6 (easy) git克隆&#xff0c;切换分支&#xff0c;qemu。根据要求进行操作即可。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 $ cd xv6-labs-2020 $ git checkout util $ make qemusleep (ea…

数据中心供配电及能效管理系统的设计要点

摘要&#xff1a;现代的数据中心中都包括大量的计算机&#xff0c;对于这种场所的电力供应&#xff0c;都要求供电系统需要在所有的时间都有效&#xff0c;这就不同于一般建筑的供配电系统&#xff0c;它是一个交叉的系统&#xff0c;涉及到市电供电、防雷接地、防静电、UPS不间…

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiGRU开普勒算法优化…

Visual Studio 2022新建项目时没有ASP.NET项目

一、Visual Studio 2022新建项目时没有ASP.NET项目 1、打开VS开发工具&#xff0c;选择工具菜单&#xff0c;点击“获取工具和功能” 2、选择“ASP.NET和Web开发”和把其他项目模板&#xff08;早期版本&#xff09;勾选上安装即可

ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com) 这题在移动不被挡板挡住以及不超过边界的情况下&#xff0c;每次走的越多那么次数就越少 只要两个每次都走b-a步&#xff08;已经是不被挡板挡住走的最多了&#xff09;&#xff0c;就不用考虑被挡板挡住的情况&#xff0c;只用单独考虑了&#xff0c;如果…

2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机分类模型

参数输入 输出 栅格 预测为负类的概率 预测为正类的概率 二值化结果 评估结果 ROC曲线

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层&#xff0c;最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

LLVM(5)ORC实例分析

ORC实例总结 总结 因为API茫茫多&#xff0c;逻辑上的一些概念需要搞清&#xff0c;编码时会容易很多。JIT的运行实体使用LLVMOrcCreateLLJIT可以创建出来&#xff0c;逻辑上的JIT实例。JIT实例需要加入运行库&#xff08;依赖库&#xff09;和用户定义的context&#xff08;…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…

点击、拖曳,15分钟搞定BI零售数据分析

早几年做数据分析还很依赖IT&#xff0c;过程复杂、耗时长、灵活性差&#xff0c;但这几年随着BI智能数据分析技术的成长&#xff0c;零售数据分析发生了翻天覆地的变化&#xff0c;其中最直观的一点就是&#xff1a;点击、拖曳&#xff0c;15分钟内就能搞定BI零售数据分析。 …

批量给每一段文字 段落加上符号

批量给每一段文字 段落加上符号 例如 要给下面的内容统一加上[xxxxxxxx] 查找替换–>查找内容 &#xff1a;输入前面统一的标识 替换为&#xff1a;–>特殊格式–>查找内容–>全部替换 先在前面加符号 在后面加符号&#xff1a; 最后效果&#xff1a;

QTableWidget 表格增删数据

QTableWidgetQTableWidgetQTableWidget部分使用方法&#xff0c;如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时&#xff0c;设置了条件判断如正则表达式&#xff0c;若用户输入的数据不合法&#xff0c;则添加失败并提示用户错误的地方&#xff0c;便于用户修…

3.3 使用广播信道的数据链路层

思维导图&#xff1a; 3.3.1 局域网的数据链路层 ### 3.3 使用广播信道的数据链路层 #### 简介 - 广播信道支持一对多通信。 - 局域网技术在20世纪70年代末兴起&#xff0c;现在在计算机网络中占有主导地位。 #### 3.3.1 局域网的数据链路层 **局域网的特点&#xff1a;** 1…

9-AJAX-上-原理详解

一、定义 1、什么是Ajax Ajax&#xff1a;即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与进行少量数据交换&#xff0c;Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。而传统的…

FairGuard游戏加固无缝兼容 Android 14 正式版

北京时间10月4日&#xff0c;谷歌公司在“Made by Google 2023”硬件发布会上公开了新版安卓操作系统—— Android 14 正式版。 为保证产品的加固效果并提供更优质的服务&#xff0c;FairGuard游戏加固团队第一时间组织人员进行了相关测试。 据测试&#xff0c;FairGuard游戏…

架构师选择题--计算机网络

架构师选择题--计算机网络 22年考题21年考题20年考题19年真题2017考题 22年考题 d http:80 https:httpssl &#xff1a;443 b b pop3是邮件接收协议&#xff1a;110 SMTP是邮件发送协议&#xff1a;25 http:80 A 网络隔离&#xff1a;防火墙&#xff08;逻辑&#xff09;&…