最新要闻
- 天天快消息!布洛芬不用抢 中国产能全球第一:一家公司就够33亿人用
- 世界即时:突发!特斯拉中国工厂将停产Model Y
- 世界速看:一箱油能跑1200公里!比亚迪护卫舰07上市 20.28万起
- 当前通讯!雷军再谈小米13徕卡影像:非常自豪 你一定会被震撼到
- 【天天时快讯】我 一个程序员 靠玩ChatGPT年薪210万
- 世界看点:DX9性能大涨80% Intel驱动打鸡血原因找到了:做法很聪明
- 关注:南京一外卖小哥逆行撞劳斯莱斯 网友:几十年外卖白送了
- 今日快看!全球首架C919正式交付 中国搞这款大飞机有多不容易?
- AI画作拍出110万高价创纪录!实测百度AI作画 效果惊艳
- 主人吃螺蛳粉:猫咪被臭到自闭
- 世界观速讯丨19岁少女无法走路 竟是因为它?国家早已明令禁止!
- 世界观焦点:AMD RX 7900 XTX渲染跑分性能曝光:感觉和RTX 4080两个时代
- 【热闻】国内电影票房已达285亿 《阿凡达2》成救命稻草:高价被指吃相难看
- 世界热推荐:为什么日本人更健康长寿?这12个“秘诀”值得借鉴
- 小米13 Pro长焦表现一绝:10cm至无穷远均可合焦
- 【报资讯】网传辽宁一有轨电车碾压电动自行车 官方回应:系剐蹭、人无碍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球通讯!Java校验自定义枚举值
项目开发中会经常使用到各种枚举值,枚举值一般都是固定的,不会随意改变其中的值。
(资料图片)
比如性别分为男女,确定之后一般都不会轻易改变,这时候使用枚举值就非常地方便。很多
时候,在页面中传入的参数就是枚举值中的一个,比如性别,或者是星期,月份,以及自定义
的各种类型等等。如果是手动校验就非常麻烦,假如有50个枚举值,不可能每一个枚举值都
进行手动校验,那这时候如何更好的校验呢?答案很简单,使用自定义的校验注解即可。
先上代码,然后在慢慢地讲解。自定义的校验注解如下:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidateValidator.class})
public @interface EnumValidate {
Class extends Enum>> enumClass();
String enumMethod() default "isValid";
String message() default "必须传入枚举类型的class";
boolean nullAble() default false;
//分组
Class> [] groups() default {};
// 负载
Class extends Payload> [] payload() default {};
// 指定多个时使用
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
EnumValidate [] value();
}
}
自定义校验注解验证器如下:
public class EnumValidateValidator implements ConstraintValidator
private Class extends Enum>> enumClass;
private String enumMethod;
private boolean nullAble;
@Override
public void initialize(EnumValidate constraintAnnotation) {
enumClass = constraintAnnotation.enumClass();
enumMethod = constraintAnnotation.enumMethod();
nullAble = constraintAnnotation.nullAble();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return nullAble;
}
try {
Object[] enumConstants = enumClass.getEnumConstants();
Method method = enumClass.getMethod(enumMethod, value.getClass());
Object result = method.invoke(enumConstants[0], value);
System.out.println("invoke--->" + result);
return (Boolean)result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("枚举类型验证错误");
}
}
}
自定义的测试枚举如下:
public enum TestEnum {
TYPE_ONE("ONE", "成功"),
TYPE_TWO("TYPE_TWO", "失败"),
;
/*
* 编码
*/
private String code;
/*
* 信息
*/
private String msg;
public String getCode() {
return code;
}
TestEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
/* @Description: 枚举里面的自定义校验方法
* @author: yilang
* @date: 2022/12/6 20:53
* @param: value
* @return: boolean
*/
public boolean isValid(String value) {
for(TestEnum testEnum : TestEnum.values()) {
if (testEnum.getCode().equals(value)) {
return true;
}
}
return false;
}
}
测试入参如下:
@Data
public class ParamTest {
/*
* 名称
*/
@NotNull(message = "名称不能为null")
private String name;
/*
* 简介
*/
@Length(max = 10, message = "简介长度最大为10")
private String abs;
@EnumValidate(enumClass = TestEnum.class, nullAble = false, message = "传入的枚举类型参数错误")
private String enumTest;
}
Controller中的测试方法如下:
@Slf4j
@RestController
@RequestMapping("/happy/yilang")
public class TestControlelr {
@PostMapping("/enum")
public String enumTest(@Valid @RequestBody ParamTest paramTest){
return "枚举类型统计";
}
}
自定义注解中主要有几个自定参数,
// 限定传入的class为枚举类型
Class extends Enum>> enumClass();
// 指定传入的需要调用的枚举类的检验方法
String enumMethod() default "isValid";
// 错误提示信息
String message() default "必须传入枚举类型的class";
// 待校验的参数是否允许为null
boolean nullAble() default false;
//分组-自定义注解最好加上
Class> [] groups() default {};
// 负载-自定义注解必加参数,否则报错
Class extends Payload> [] payload() default {};
自定义注解校验器EnumValidateValidator 需要实现接口ConstraintValidator,然后重写里面的校验方法。
// 返回枚举类的元素 enumClass是通过注解拿到的,然后初始化的时候赋值给成员变量
Object[] enumConstants = enumClass.getEnumConstants();
// 获取需要执行的方法 enumMethod是通过注解拿到的,然后初始化的时候赋值给成员变量
// value.getClass()可以获取到原始传入数据的类型
Method method = enumClass.getMethod(enumMethod, value.getClass());
// 使用反射的方式执行方法,传入枚举变量和参数 程序底层会调用注解中获取到的需要执行的校验方法,默认为isValid,可以任意修改
Object result = method.invoke(enumConstants[0], value);
// 自定义枚举类中isValid 方法返回的值是一个Object类型,可以转换为布尔类型
return (Boolean)result;
自定义枚举类中,isValid是自定义方法,名称可以随便取。TestEnum.values()是每一个枚举类中都自带的方法,可以获取当前枚举的所有值。
public boolean isValid(String value) {
for(TestEnum testEnum : TestEnum.values()) {
if (testEnum.getCode().equals(value)) {
return true;
}
}
return false;
}
Controller中的方法和参数中使用注解的方式都很常规,不在赘述。
测试结果如下,通过校验的测试
未通过校验的测试
参考文章:
https://blog.csdn.net/h2604396739/article/details/83825148
环球通讯!Java校验自定义枚举值
全球观天下!第一百一十一篇:基本引用类型Date
天天快消息!布洛芬不用抢 中国产能全球第一:一家公司就够33亿人用
天天短讯!BLOG-3总结
世界即时:突发!特斯拉中国工厂将停产Model Y
世界速看:一箱油能跑1200公里!比亚迪护卫舰07上市 20.28万起
当前通讯!雷军再谈小米13徕卡影像:非常自豪 你一定会被震撼到
【天天时快讯】我 一个程序员 靠玩ChatGPT年薪210万
世界看点:DX9性能大涨80% Intel驱动打鸡血原因找到了:做法很聪明
关注:南京一外卖小哥逆行撞劳斯莱斯 网友:几十年外卖白送了
今日快看!全球首架C919正式交付 中国搞这款大飞机有多不容易?
AI画作拍出110万高价创纪录!实测百度AI作画 效果惊艳
主人吃螺蛳粉:猫咪被臭到自闭
世界观速讯丨19岁少女无法走路 竟是因为它?国家早已明令禁止!
rsync远程同步
世界观焦点:AMD RX 7900 XTX渲染跑分性能曝光:感觉和RTX 4080两个时代
【热闻】国内电影票房已达285亿 《阿凡达2》成救命稻草:高价被指吃相难看
世界热推荐:为什么日本人更健康长寿?这12个“秘诀”值得借鉴
小米13 Pro长焦表现一绝:10cm至无穷远均可合焦
【报资讯】网传辽宁一有轨电车碾压电动自行车 官方回应:系剐蹭、人无碍
netmiko+textfsm自动统计交换机端口模块型号数量与闲置模块
【全球独家】【网关开发】4.Openresty 使用events插件进行事件通知
世界新消息丨蒟蒻颤抖:AI打信奥赛,三分之二赛题一遍过
【求助帖】从技术转为项目经理后,如何快速进入角色?
angr_ctf——从0学习angr(四):库操作和溢出漏洞利用
【世界速看料】新一代广汽本田皓影官图发布:大嘴变方嘴、可选7座
《原神》获TGA“玩家之声”奖!官方发800原石:全体都有
世界新动态:一部车骑10年!绿源推出INNO9-lite电动自行车:新国标 80km续航
天天快消息!NVIDIA发布527.56显卡驱动程序:DLSS 3游戏性能更强了
天天最资讯丨站起来了!哈弗H6插电混动版11月销量首超4000:直逼问界M5
焦点速递!CSS绝对定位7大应用场景实战案例分享
教你用CSS实现表单部件
环球热议:物联网平台在AIoT领域8大场景应用
东航官宣全球第一架C919商业首飞时间!这7大城市有福了
打爆丰田、本田混动SUV 比亚迪护卫舰07上市:20.28万起
天天微资讯!换代!AMD锐龙9 7950X3D来了:游戏性能比酷睿i9-13900K高出33%
【速看料】全国5G网络接入速率出炉:北京、上海都没抢到第一 移动最快
【世界新要闻】上线7年无敌手!《王者荣耀》11月吸金超13亿元:蝉联销冠
观点:MYSQL 1 DAY
世界微速讯:智能PDU,网络远程管理电源能耗提升配电效率
当前滚动:“云办公”如何用任务协同工具搞定项目和团队管理?
今日聚焦!SSM整合(spring-springmvc-mybatis)之CRUD
焦点日报:又拓新业务 比亚迪全新皮卡谍照曝光:DM混动没跑了
热点!不掉绒、无静电!史努比牛奶绒床品四件套大促:券后99元
天天快讯:一箭十四星 捷龙三号运载火箭首飞发射成功:海陆两用
焦点快播:QQ等级全球第一咋做到的?本人回应让网友羡慕:小时候家里开网吧
官方“挖墙脚”?网易《逆水寒》宣布推出“网易魔兽老兵服”
资讯:vscode使用chatGPT
全球滚动:我与 ChatGPT 讨论了面向对象语言 中,关于动态调用的问题
快播:第三方登录组件-JustAuth
【环球报资讯】BI智慧仓储,带你体验数字化仓储物流管理
环球今亮点!把ipa文件上传到App Store教程步骤
每日热讯!易基因:简化甲基化测序(RRBS)在植物生态表观基因组学中的机遇和局限|深度综述
当前聚焦:记.net framework php接口 返回数据格式问题 请求接口远程服务器返回错误: (500) 内部服务器错误
ChatGPT 大白话 SmartIDE
Zabbix与乐维监控对比分析(三)——对象管理篇
全球报道:专访|开源之夏最佳质量奖 Apache RocketMQ Committer 黄章衡
世界热消息:.net6制作让同事不能上网的arp欺骗工具
每日热门:如何利用 A/B 实验提升产品用户留存? 看字节实战案例给你答案!
chatGPT辣么火,你却不会注册
每日速讯:2022最新上传ipa到appstore的步骤说明
怎么在电脑上查看iPhone定位?iphone定位不准怎么校正?
怎么验证windows是不是正版?验证windows正版的方法有哪些?
光大银行信用卡额度一般是多少?光大银行信用卡怎么查询进度?
银行卡号泄露有危险吗?银行卡号泄露挂失有用吗?
空调怎么省电?空调省电的正确用法有哪些?
word文档怎么做思维导图?word文档怎么做小抄?
宏碁4750g怎么进入bios?宏碁4750G需要哪些驱动?
电视机顶盒怎么破解?电视机顶盒哪个牌子好用?
诺基亚710上市价格是多少?诺基亚710手机现在能用吗?
天然气热值是多少大卡?天然气热值换算表
环球热议:行为管理(锐捷业务软件篇)
焦点报道:直播间疯狂刷礼物可能是在洗钱:网络水军用千部手机给主播打赏 最多刷10亿元
国产操作系统deepin推送20.8版本:wine应用开启速度获得提升
联想PC小新桌面助手上线:实用性堪比手机控制中心
无叶无根无枝条的花你见过没?曾消失30年:开败后就变黑
世界今亮点!《原神》《幻塔》都败了!《MARVEL SNAP》摘得TGA 2022年度最佳手游
【全球速看料】BI智慧仓储行业应用方案,让你的仓储物流不再复杂
【全球播资讯】RTX 3050加持 联想轻薄旗舰本小新Pro 16史低价:5799元
【聚看点】特斯拉左转失控 车主称刹车和方向盘突然变硬:官方售后回应尴尬
观热点:海外经销商顶不住:RTX 4080英国又降价 轻松降近900元还会继续
焦点播报:首批车主反馈良好!恒驰汽车回应停工停产传闻:恒驰5按计划交付
即时焦点:谷歌Chrome浏览器新模式上线:最多可减少30%内存占用
每日消息!2岁就给爹打工 马斯克给儿子发了一张工牌
世界球精选!《仙剑奇侠传七》更新2.0版本:体积直接减半 内存、显存占用更低
振奋!全球首架C919今日交付中国东方航空:大家啥时候能坐上国产大飞机?
真实感渲染:变换(二维与三维)
老年人到底要不要打新冠疫苗?怎么打?一文说清
世界实时:对称加密
信息:CSS相对定位3大应用场景5个实战应用案例详解
今日最新!FreeSWITCH学习笔记:系统架构
Redis主从复制,哨兵模式和集群模式
漏洞预警:宝塔面板疑似出现高危漏洞
看不上油改电 要不来看看电改油?3000公里不用充电
友商旗舰陆续发布 产品经理:小米13毫无压力
焦点热文:支付宝可以绑境外银行卡了:4步搞定 直接扫码
世界快消息!SpringBoot中统一日志管理
MAUI新生3.5-深入理解XAML:行为Behavior
动态焦点:人工智能ChatGPT被玩坏了
世界百事通!卖不动车后 特斯拉上海工厂最新现状:闲下来了