外贸网站后台企业信用信息网公示网官网查询

张小明 2026/1/10 18:32:26
外贸网站后台,企业信用信息网公示网官网查询,12306的网站建设,本科学历提升一、 背景与痛点 在 Spring Boot 后端开发中#xff0c;我们经常遇到需要前端传递 “状态码”、“类型” 或 “场景码” 的情况。这些值在后端通常对应一个枚举#xff08;Enum#xff09;。 例如#xff0c;发送短信的场景#xff08;scene#xff09;#xff1a; 1: 登…一、 背景与痛点在 Spring Boot 后端开发中我们经常遇到需要前端传递“状态码”、“类型”或“场景码”的情况。这些值在后端通常对应一个枚举Enum。例如发送短信的场景scene1: 登录2: 忘记密码3: 注册痛点在于如果前端传了一个99不存在的场景或者传了一个非法的数字如果后端只用了NotNull这个非法值会穿透 Controller 进入 Service 层导致业务逻辑报错如空指针或者产生脏数据。我们需要一个机制像保安一样手里拿着一份“白名单”只有在枚举范围内定义过的值才允许通过。本文将带你实现一个高性能的自定义注解InEnum。二、 核心架构设计为了实现通用且高性能的校验我们需要三个组件配合接口 (ArrayValuable)定义统一的规范要求枚举类必须提供一个“返回所有合法值”的方法。注解 (InEnum)标注在 DTO 字段上指定使用哪个枚举类作为白名单。校验器 (InEnumValidator)执行具体的校验逻辑。1. 定义统一接口为了让校验器能读懂所有的枚举我们需要定义一个接口。publicinterfaceArrayValuableT{/** * return 返回枚举中所有合法的数值集合 */T[]array();}2. 定义注解 InEnum这是 JSR-303 标准的自定义注解写法。Target({ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})Retention(RetentionPolicy.RUNTIME)DocumentedConstraint(validatedByInEnumValidator.class)// 指定校验器publicinterfaceInEnum{/** * return 必须传入实现 ArrayValuable 接口的枚举类 */Class?extendsArrayValuable?value();Stringmessage()default必须在指定范围 {value};Class?[]groups()default{};Class?extendsPayload[]payload()default{};}关键点解析Class? extends ArrayValuable? value();这里利用泛型限定强制要求使用该注解时传入的 Class 必须是实现了ArrayValuable接口的类。这在编译期就杜绝了乱传 Class 的可能。3. 实现校验器 InEnumValidator这是“执法者”负责初始化白名单并进行比对。publicclassInEnumValidatorimplementsConstraintValidatorInEnum,Object{// 缓存白名单避免每次校验都去反射计算privateList?values;Overridepublicvoidinitialize(InEnumannotation){// 1. 获取注解传入的枚举类的所有实例value()返回的就是实现了ArrayValuable接口的类// getEnumConstants()返回的就是实现类中的所有枚举类型ArrayValuable?[]constantsannotation.value().getEnumConstants();if(constants.length0){this.valuesCollections.emptyList();}else{// 2. 【核心】随便拿第一个实例调用接口的 array() 方法拿到白名单// 利用了接口多态性根本不需要关心具体是哪个 Enumthis.valuesArrays.asList(constants[0].array());}}OverridepublicbooleanisValid(Objectvalue,ConstraintValidatorContextcontext){// Object value指的是Inenum标注的字段也就是前端传入的// 1. 判空放行非空校验交给 NotNull 处理保持职责单一if(valuenull){returntrue;}// 2. 校验通过值在白名单内if(values.contains(value)){returntrue;}// 3. 校验失败自定义友好的报错信息// 禁用默认提示改写为必须在指定范围 [1, 2, 3]context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate().replaceAll(\\{value},values.toString())).addConstraintViolation();returnfalse;}}三、 最佳实践案例SmsSceneEnum有了基础设施我们来看看在业务中如何优雅地使用。这里展示一个高性能的枚举写法。1. 编写枚举类GetterAllArgsConstructorpublicenumSmsSceneEnumimplementsArrayValuableInteger{MEMBER_LOGIN(1,user-sms-login,会员用户 - 手机号登陆),MEMBER_UPDATE_MOBILE(2,user-update-mobile,会员用户 - 修改手机),MEMBER_UPDATE_PASSWORD(3,user-update-password,会员用户 - 修改密码),// ... 其他枚举值ADMIN_MEMBER_LOGIN(21,admin-sms-login,后台用户 - 手机号登录);// 【性能黑科技】// 在类加载时就利用 Stream 流计算好所有合法的 scene 值存入静态数组。// 避免了每次调用 array() 方法都要去遍历 values()极大提升性能。publicstaticfinalInteger[]ARRAYSArrays.stream(values()).map(SmsSceneEnum::getScene).toArray(Integer[]::new);privatefinalIntegerscene;privatefinalStringtemplateCode;privatefinalStringdescription;// 实现接口方法直接返回计算好的静态数组OverridepublicInteger[]array(){returnARRAYS;}// ... getCodeByScene 等其他方法}2. 在 DTO 中使用DatapublicclassSmsSendReqVO{Schema(description手机号,requiredModeSchema.RequiredMode.REQUIRED)Mobile// 假设有一个手机号格式校验注解privateStringmobile;Schema(description发送场景,requiredModeSchema.RequiredMode.REQUIRED,example1)NotNull(message发送场景不能为空)// 一行代码搞定白名单校验InEnum(valueSmsSceneEnum.class,message发送场景必须是 {value})privateIntegerscene;}四、 运行原理深度解析当前端请求接口时整个校验流程如下Spring 启动/首次调用时InEnumValidator的initialize方法被触发。它拿到SmsSceneEnum.class。它获取SmsSceneEnum的第一个实例MEMBER_LOGIN。它调用MEMBER_LOGIN.array()。关键点array()方法直接返回了SmsSceneEnum中预先计算好的static final ARRAYS([1, 2, 3, 21])。Validator 将这个 List 存入内存this.values。前端请求到来 (scene 99)进入isValid方法。判断values.contains(99)。结果为false。拦截请求抛出异常。前端收到错误提示发送场景必须是 [1, 2, 3, 21]。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

药品网站网络营销推广怎么做开发公司招聘

第一章:量子模拟器扩展的 VSCode 调试在开发量子算法时,调试是确保逻辑正确性的关键环节。Visual Studio Code(VSCode)通过官方提供的量子开发工具包扩展(Quantum Development Kit, QDK),支持对…

张小明 2026/1/5 20:43:18 网站建设

租用网站如何制作网页阿里外贸平台

Sketch Find And Replace插件完全教程:零基础快速掌握批量文本替换技巧 【免费下载链接】Sketch-Find-And-Replace Sketch plugin to do a find and replace on text within layers 项目地址: https://gitcode.com/gh_mirrors/sk/Sketch-Find-And-Replace 还…

张小明 2026/1/6 23:12:39 网站建设

防火墙 网站做端口映射桂林临桂区建设局网站

在数据驱动的时代,如何快速从海量信息中提取有价值的内容成为关键挑战。PivotTable.js作为一个开源的JavaScript数据透视表库,通过直观的拖拽操作和灵活的视图切换,让数据分析变得简单而高效。 【免费下载链接】pivottable Open-source Javas…

张小明 2026/1/7 3:04:35 网站建设

网站认证要钱免费公司主页网站

加法器的“速度游戏”:如何在DSP系统中打赢这场延迟之战?你有没有遇到过这样的情况:明明算法已经优化到极致,FPGA资源也分配得井井有条,可综合出来的时序报告里,关键路径还是卡在一个加法器上?别…

张小明 2026/1/6 16:20:30 网站建设

j昆明网站制作公司python 做网站相关的库

Wechaty微信机器人开发实战:智能处理各类消息的终极指南 【免费下载链接】wechaty 项目地址: https://gitcode.com/gh_mirrors/wec/wechaty Wechaty是一个强大的开源微信机器人开发框架,通过其独特的模块化设计,开发者可以轻松构建智…

张小明 2026/1/9 19:14:17 网站建设

找私人做网站程序费用室内设计学校排名榜国内

第一章:Rust-PHP 扩展的版本适配 在构建基于 Rust 编写的 PHP 扩展时,版本兼容性是确保扩展稳定运行的关键因素。PHP 的内核 API 在不同主版本之间存在显著差异,而 Rust 通过 php-rs 或 ext-php-rs 等绑定库与 PHP 交互,因此必须…

张小明 2026/1/6 13:56:31 网站建设