springboot 自定义注解

1、引入maven依赖(版本太低也会导致不生效)

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

2、创建注解接口(javax.validation版本是2.0.0的,自行选择,太低也不行)

package com.wang.test.annotation;
import com.wang.test.annotation.CheckField.List;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;import static java.lang.annotation.ElementType.*;
//主要标记在什么代码上可以使用
//    TYPE,//类,接口(包括注解类型)或枚举的声明
//    FIELD,//属性的声明
//    METHOD,//方法的声明
//    PARAMETER,//方法形式参数声明
//    CONSTRUCTOR,//构造方法的声明
//    LOCAL_VARIABLE,//局部变量声明
//    ANNOTATION_TYPE,//注解类型声明
//    PACKAGE//包的声明
@Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(List.class)
//CheckValidator  自定义类,主要用于注解校验
@Constraint(validatedBy = CheckValidator.class)
public @interface CheckField {String message() default "密码必须包含至少一个大写字母、一个小写字母和一个数字";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE})@Retention(RetentionPolicy.RUNTIME)@Documented@interface List {CheckField[] value();}
}
package com.wang.test.annotation;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;//CheckField  自定义注解的接口
public class CheckValidator implements ConstraintValidator<CheckField, String> {private static final String PASSWORD_PATTERN = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$";@Overridepublic void initialize(CheckField constraintAnnotation) {}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {
//        if (!value.matches(PASSWORD_PATTERN)) {
//            throw new RuntimeException("大大");
//        }
//        return value.matches(PASSWORD_PATTERN);if (value.contains("*")){throw new RuntimeException("包含");}else {return true;}}
}

3、可以创建全局异常来捕获(Result可以自己定义)

package com.wang.test.annotation;import com.wang.test.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.omg.CORBA.SystemException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler(SystemException.class)public Result systemExceptionHandler(SystemException e) {log.error("出现了异常! {}", e);return Result.nok(e.getCause().getMessage());}@ExceptionHandler(Exception.class)public Result exceptionHandler(Exception e) {log.error("出现了异常! {}", e);return Result.nok(e.getCause().getMessage());}/* 添加校验参数异常处理 */@ExceptionHandler(BindException.class)public Result bindExceptionHandler(BindException e) {log.error("出现了异常! {}", e);return Result.nok(e.getCause().getMessage());}
}

4、统一返回结果类

package com.wang.test.utils;public class Result<T> {private static final String SUCCESS = "SUCCESS";private static final String FAIL = "FAIL";private String code;private String message;private T Data;public Result(String code) {this.code = code;}public Result(String code, String message) {super();this.code = code;this.message = message;}public Result(String code, String message, T data) {super();this.code = code;this.message = message;Data = data;}public Result() {}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return Data;}public void setData(T data) {Data = data;}public static <T> Result<T> ok(T object) {return new Result<T>(SUCCESS, "", object);}public static <T> Result<T> ok() {return new Result<T>(SUCCESS);}public static <T> Result<T> nok(String message) {return new Result<T>(FAIL, message);}public static <T> Result<T> nok() {return new Result<T>(FAIL);}public static <T> Result<T> nok(String code, String message) {return new Result<T>(code, message);}public static <T> Result<T> nok(String code, String message, T object) {return new Result<T>(code, message, object);}
}

5、场景使用

package com.wang.test.entity;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wang.test.annotation.CheckField;
import com.wang.test.utils.CustomStringStringConverter;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.annotation.Validated;import javax.validation.Valid;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;@Data
@EqualsAndHashCode(callSuper = false)
//@Accessors(chain = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WaterMeter implements Serializable {/**@CheckField(message = "dadad")@TableField("waterMeter")@ExcelProperty(value = {"水表数据","水表名"},converter = CustomStringStringConverter.class)private String waterMeter;private List<@Valid uesr> uesrList;
}package com.wang.test.entity;import com.wang.test.annotation.CheckField;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** @BelongsPackage: com.wang.test.entity* @Author: wangqian* @CreateTime: 2023-08-08  09:15:59* @Describe:*/
@Data
@EqualsAndHashCode(callSuper = false)
public class uesr {String id;@CheckField()String age;}//这个是接口,需要在接口传参上加@Validated 注解,
//注解版本(org.springframework:spring-context:5.3.26)
@PostMapping("/getDataById")public Result a(@Validated @RequestBody WaterMeter waterMeter){
//        WaterMeter waterMeter = waterMeterService.getDataById(id);return Result.ok(waterMeter);}

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

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

相关文章

深度分析纳斯达克上市公司慧择的竞争优势和投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 一、保险行业的现状、竞争与机遇 在疫情期间&#xff0c;很多行业的经营理念与经营方式&#xff0c;甚至客户行为、客户需求都发生了变化&#xff0c;进而催生出新的机遇。保险行业亦是如此&#xff0c;受疫情影响&#xf…

用Python编程实现百度自然语言处理接口的对接,助力你开发智能化处理程序

用Python编程实现百度自然语言处理接口的对接&#xff0c;助力你开发智能化处理程序 随着人工智能的不断进步&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;成为了解决文本处理问题的重要工具。百度自然语言处理接口提供了一系…

腾讯开启2024校招,主要招聘5大类岗位

近日&#xff0c;腾讯的大动作一个接一个&#xff0c;前脚刚公布2023上半年财报&#xff0c;后脚就开启了2024校招&#xff0c;不得不让人感叹腾讯真速度&#xff01; 此次招聘对象为毕业时间在2023年9月至2024年8月期间的2024届应届毕业生&#xff0c;覆盖北上广深等多个城市…

异步编程框架Seastar介绍

使用Seastar进行异步(Asynchronout)编程 介绍 我们在本文中介绍的Seastar&#xff0c;是一个用于在现代多核机器上&#xff0c;编写高效复杂的服务器应用程序的C库。 传统上&#xff0c;用于编写服务器应用程序的编程语言库和框架已经分为两个不同的阵营&#xff1a;那些注重…

环境与能源创新专题:地级市绿色创新、碳排放与环境规制数据

数据简介&#xff1a;推动绿色发展&#xff0c;促进人与自然和谐共生是重大战略举措。绿色发展强调“绿水青山就是金山银山”&#xff0c;人与自然和谐共生重在正确处理生态环境保护与经济发展的关系。在着力于实现绿色发展的过程中&#xff0c;绿色创新是绿色发展的重要驱动因…

关于API数据接口获取商品的数据的说明

获取商品数据已经成为许多应用程序的重要组成部分。为了实现这一目标&#xff0c;许多公司和技术开发者使用API数据接口来获取相关数据。本文将详细介绍如何使用API数据接口获取商品数据&#xff0c;并使用Python作为编程语言示例来展示相关代码。 API数据接口是一种通信协议&…

WPF的CheckBox中的三个状态

WPF的CheckBox中的三个状态 CheckBox控件和RadioButton控件是继承自ToggleButton类&#xff0c;这意味着用户可切换他们的开关状态&#xff0c;其中IsChecked属性是可空的Boolean类型&#xff0c;这意味着该属性可以设置为true&#xff0c;false或null。 null值表示不确定状态…

spring.HttpMessageNotReadableException: JSON parse error

实体类如下&#xff1a; Value public class Search{//搜索内容String value;//是否模糊搜索boolean fuzzy true; //其实这样写并不是“默认”模糊搜索&#xff0c;而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…

GPU Microarch 学习笔记 [1]

WARP GPU的线程从thread grid 到thread block&#xff0c;一个thread block在CUDA Core上执行时&#xff0c;会分成warp执行&#xff0c;warp的颗粒度是32个线程。比如一个thread block可能有1024个线程&#xff0c;分成32个warp执行。 上图的CTA&#xff08;cooperative thre…

10条SQL优化技巧

一、一些常见的SQL实践 &#xff08;1&#xff09;负向条件查询不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好习惯 可以优化为in查询&#xff1a; select * from order where status in(2,3) &#xff08;2&#xff09;前导模…

Codeforces Round 893 (Div. 2)B题题解

文章目录 [The Walkway](https://codeforces.com/contest/1858/problem/B)问题建模问题分析1.分析所求2.如何快速计算每个商贩被去除后的饼干数量代码 The Walkway 问题建模 给定n个椅子&#xff0c;其中有m个位置存在商贩&#xff0c;在商贩处必须购买饼干吃&#xff0c;每隔…

Python程序设计——字符串处理的特殊方法

学习目标&#xff1a; 学习如何创建字符串使用len、min和max函数获取一个字符串的长度、串中的最大和最小的字符使用下标运算符([])访问字符串中的元素使用截取运算符str[ start:end]从较长的字符串中得到一个子串使用运算符连接两个字符串&#xff0c;通过*运算符复制一个字符…

【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建

【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建 虚拟机环境&#xff0c;UBUNTU20.04 文章目录 【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建一、Odroid C4交叉编译工具链安装二、QT下载及编译安装1.QT下载2.交叉编译QT 配置QtCreator可以[参考](https://bl…

快速入门vue3新特性和新的状态管理库pinia

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Vue3.3新特性 defineOptions defineModel pinia 介绍 与 Vuex 3.x/4.x 的比较 安装 核心概念 定义…

前馈神经网络多分类任务

pytorch深度学习的套路都差不多&#xff0c;多看多想多写多测试&#xff0c;自然就会了。主要的技术还是在于背后的数学思想和数学逻辑。 废话不多说&#xff0c;上代码自己看。 import torch import numpy as np import torch.nn as nn import torchvision import torchvisi…

【腾讯云Cloud Studio实战训练营】使用Cloud Studio社区版快速构建React完成点餐H5页面还原

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&#x1f4bb;上一篇…

成集云 | 用友U8采购请购单同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 用友U8是中国用友集团开发和推出的一款企业级管理软件产品。具有丰富的功能模块&#xff0c;包括财务管理、采购管理、销售管理、库存管理、生产管理、人力资源管理、客户关系管理等&#xff0c;可根据企业的需求选择相应的模块进行集…

什么是原子交换?

安全地在各个区块链网络之间传输资产对于释放被困流动性并吸引更多用户进入这一领域至关重要&#xff0c;同时也保持 Web3 的信任最小化核心价值。原子交换是一种让两个人在不依赖于中介来促成交易的情况下&#xff0c;在不同的区块链网络之间交换通证资产的方式。这为 DeFi 用…

Linux硬链接和软连接

1、硬链接 硬连接指通过索引节点来进行连接。在 Linux 的文件系统中&#xff0c;保存在磁盘分区中的文件不管是什么类型都给它分配一个编号&#xff0c;称为索引节点号(Inode Index)。在 Linux 中&#xff0c;多个文件名指向同一索引节点是存在的。比如&#xff1a;A 是 B 的硬…

数据结构之队列详解(包含例题)

一、队列的概念 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操…