validation之自定義注解@Constraint

前言:

首先,接口參數校驗應該都不陌生,大部分應該都會借助javax.validation進行快捷校驗,一般都是在入參字段上添加@NotNull、@NotEmpty等,對于一些特殊的入參校驗邏輯,可能不是很適用,現在介紹一下自定義注解方式。

依賴:

    <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.10.Final</version></dependency>

代碼:

自定義注解:

import javax.validation.Constraint;
import javax.validation.Payload;import java.lang.annotation.*;@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {String message() default "";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** 目標枚舉類*/Class<? extends Enum> target() default Enum.class;
}

實際校驗類:

import com.honor.wpshowdemo.serverone.valid.EnumValid;
import org.apache.commons.lang.StringUtils;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class EnumValidator implements ConstraintValidator<EnumValid, Object> {private EnumValid annotation;@Overridepublic void initialize(EnumValid constraintAnnotation) {annotation = constraintAnnotation;}@Overridepublic boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {boolean result = false;Class<?> cls = annotation.target();// target為枚舉,并且value有值,才進行校驗if (cls.isEnum() && (value != null)) {Object[] objects = cls.getEnumConstants();for (Object obj : objects) {//object類型轉mapClass<?> jqlEnum = obj.getClass();Field[] fs = jqlEnum.getDeclaredFields();Map<String, String> objMap = new HashMap<>();for (Field f : fs) {f.setAccessible(true);try {objMap.put(f.getName(), f.get(obj).toString());} catch (IllegalArgumentException | IllegalAccessException e) {e.printStackTrace();}}if (objMap.get("code") != null && StringUtils.equals(objMap.get("code"), String.valueOf(value))) {result = true;break;}}}return result;}
}

測試:

測試代碼:

import lombok.Getter;public enum TestEnum {FAILED(0),SUCCESS(1);@Getterprivate Integer id;TestEnum(Integer id) {this.id = id;}
}
import lombok.Data;@Data
public class TestRequest {@EnumValid(target = TestEnum.class, message = "id不符合要求")private Integer id;
}
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;@RestController
public class TestController {@PostMapping("/test")public void test(@RequestBody @Valid TestRequest testRequest) {}
}

測試結果如下:

至此結束,歡迎指正。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ECMAScript】ES6-ES11學習筆記

文章目錄 注意事項1.聲明變量2.定義常量3.解構賦值4.模板字符串5.簡化對象寫法6.箭頭函數7.參數默認值8.rest參數9.擴展運算符10.Symbol11.生成器函數12.Promise基本語法13.集合set14.Map15.類class16.數值擴展17.對象私有屬性18.對象方法擴展19.js文件模塊化20.async和await21…

數據庫操作不再困難,MyBatis動態Sql標簽解析

系列文章目錄 MyBatis緩存原理 Mybatis的CachingExecutor與二級緩存 Mybatis plugin 的使用及原理 MyBatis四大組件Executor、StatementHandler、ParameterHandler、ResultSetHandler 詳解 MyBatisSpringboot 啟動到SQL執行全流程 數據庫操作不再困難&#xff0c;MyBatis動態S…

Neo4j之MATCH基礎

1】基本匹配和返回&#xff1a;查找所有節點和關系&#xff0c;返回節點的標簽和屬性。 MATCH (n) RETURN n;2】條件篩選&#xff1a;查找所有名為 "Alice" 的人物節點。 MATCH (person:Person {name: Alice}) RETURN person;3】關系查詢&#xff1a;查找所有和 &q…

Centos7.6 安裝mysql過程全記錄

在centos 7.6上 離線安裝mysql 的步驟&#xff0c;可參考下文&#xff1a; 一、查看當前MySQL的安裝情況并卸載 1. 查看當前MySQL的安裝情況 查找之前是否安裝了MySQL rpm -qa|grep -i mysql 2.卸載mysql 如果已經安裝mysql&#xff0c;則需要先停止MySQL&#xff0c;再刪除…

YOLOv5、YOLOv8改進:MobileViT:輕量通用且適合移動端的視覺Transformer

MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer 論文&#xff1a;https://arxiv.org/abs/2110.02178 1簡介 MobileviT是一個用于移動設備的輕量級通用可視化Transformer&#xff0c;據作者介紹&#xff0c;這是第一次基于輕量級CNN網絡性…

LeetCode150道面試經典題--單詞規律(簡單)

1.題目 給定一種規律 pattern 和一個字符串 s &#xff0c;判斷 s 是否遵循相同的規律。 這里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每個字母和字符串 s 中的每個非空單詞之間存在著雙向連接的對應規律。 2.示例 pattern"abba" s "c…

SpingBoot-Vue前后端——實現CRUD

目錄??????? 一、實例需求 ? 二、代碼實現 &#x1f3cc; 數據庫 &#x1f440; 后端實現 &#x1f4eb; 前端實現 &#x1f331; 三、源碼下載 &#x1f44b; 一、實例需求 ? 實現一個簡單的CRUD&#xff0c;包含前后端交互。 二、代碼實現 &#x1f3cc; 數…

[樹莓派]ImportError: libcblas.so.3: cannot open shared object file

嘗試在樹莓派4b安裝opencv-python,出現以下錯誤,ImportError: libcblas.so.3: cannot open shared object file: No such file or directory 解決方法&#xff0c;安裝依賴 sudo apt install libatlas-base-dev 再次import cv2就不會報這個錯誤。

約束綜合中的邏輯互斥時鐘(Logically Exclusive Clocks)

注&#xff1a;本文翻譯自Constraining Logically Exclusive Clocks in Synthesis 邏輯互斥時鐘的定義 邏輯互斥時鐘是指設計中活躍&#xff08;activate&#xff09;但不彼此影響的時鐘。常見的情況是&#xff0c;兩個時鐘作為一個多路選擇器的輸入&#xff0c;并根據sel信號…

八、解析應用程序——分析應用程序(1)

文章目錄 一、確定用戶輸入入口點1.1 URL文件路徑1.2 請求參數1.3 HTTP消息頭1.4 帶外通道 二、確定服務端技術2.1 提取版本信息2.2 HTTP指紋識別2.3 文件拓展名2.4 目錄名稱2.5 會話令牌2.6 第三方代碼組件 小結 枚舉盡可能多的應用程序內容只是解析過程的一個方面。分析應用程…

小龜帶你敲排序之冒泡排序

冒泡排序 一. 定義二.題目三. 思路分析&#xff08;圖文結合&#xff09;四. 代碼演示 一. 定義 冒泡排序&#xff08;Bubble Sort&#xff0c;臺灣譯為&#xff1a;泡沫排序或氣泡排序&#xff09;是一種簡單的排序算法。它重復地走訪過要排序的數列&#xff0c;一次比較兩個元…

【深度學習】再談向量化

前言 向量化是一種思想&#xff0c;不僅體現在可以將任意實體用向量來表示&#xff0c;更為突出的表現了人工智能的發展脈絡。向量的演進過程其實都是人工智能向前發展的時代縮影。 1.為什么人工智能需要向量化 電腦如何理解一門語言&#xff1f;電腦的底層是二進制也就是0和1&…

Arduino+esp32學習筆記

學習目標&#xff1a; 使用Arduino配置好藍牙或者wifi模塊 學習使用python配置好藍牙或者wifi模塊 學習內容&#xff08;筆記&#xff09;&#xff1a; 一、 Arduino語法基礎 Arduino語法是基于C的語法,C又是c基礎上增加了面向對象思想等進階語言。那就只記錄沒見過的。 單多…

全國各城市-貨物進出口總額和利用外資-外商直接投資額實際使用額(1999-2020年)

最新數據顯示&#xff0c;全國各城市外商直接投資額實際使用額在過去一年中呈現了穩步增長的趨勢。這一數據為研究者提供了對中國外商投資活動的全面了解&#xff0c;并對未來投資趨勢和政策制定提供了重要參考。 首先&#xff0c;這一數據反映了中國各城市作為外商投資的熱門目…

Effective Java筆記(31)利用有限制通配符來提升 API 的靈活性

參數化類型是不變的&#xff08; invariant &#xff09; 。 換句話說&#xff0c;對于任何兩個截然不同的類型 Typel 和 Type2 而言&#xff0c; List<Type1 &#xff1e;既不是 List<Type 2 &#xff1e; 的子類型&#xff0c;也不是它的超類型 。雖然 L ist<String…

Oracle自定義函數生成MySQL表結構的DDL語句

1. 自定義函數fnc_table_to_mysql create or replace function fnc_table_to_mysql ( i_owner in string, i_table_name in string, i_number_default_type in string : decimal, i_auto_incretment_column_name in stri…

Linux 文件查看命令

一、cat命令 1.cat文件名&#xff0c;查看文件內容&#xff1a; 例如&#xff0c;查看main.c文件的內容&#xff1a; 2.cat < 文件名&#xff0c;往文件中寫入數據&#xff0c; Ctrld是結束輸入 例如&#xff0c;向文件a.txt中寫入數據&#xff1a; 查看剛剛寫入a.txt的…

Yolov5(一)VOC劃分數據集、VOC轉YOLO數據集

代碼使用方法注意修改一下路徑、驗證集比例、類別名稱&#xff0c;其他均不需要改動&#xff0c;自動劃分訓練集、驗證集、建好全部文件夾、一鍵自動生成Yolo格式數據集在當前目錄下&#xff0c;大家可以直接修改相應的配置文件進行訓練。 目錄 使用方法&#xff1a; 全部代碼…

解決監督學習,深度學習報錯:AttributeError: ‘xxx‘ object has no attribute ‘module‘!!!!

哈嘍小伙伴們大家好呀&#xff0c;很長時間沒有更新啦&#xff0c;最近在研究一個問題&#xff0c;就是AttributeError: xxx object has no attribute module 今天終于是解決了&#xff0c;所以來記錄分享一下&#xff1a; 我這里出現的問題是&#xff1a; 因為我的數據比較大…

SQL優化

一、插入數據 優化 1.1 普通插入&#xff08;小數據量&#xff09; 普通插入&#xff08;小數據量&#xff09;&#xff1a; 采用批量插入&#xff08;一次插入的數據不建議超過1000條&#xff09;手動提交事務主鍵順序插入 1.2 大批量數據插入 大批量插入&#xff1a;&…