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.pswp.cn/news/41972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41972.shtml
英文地址,請注明出處:http://en.pswp.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;隊列是一種操作受限制的線性表。進行插入操…