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

张小明 2026/1/19 22:00:19
外贸网站后台,企业信用信息网公示网官网查询,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进行投诉反馈,一经查实,立即删除!

做和别人类似的网站侵权吗做健康类网站怎么备案

11月14日,任正非在位于上海的华为练秋湖研发中心与ICPC全球优胜者及教练座谈,围绕AI未来、教育本质与青年成长展开对话。他强调“教育是教育,商业是商业”,并指出人工智能应聚焦未来三至五年的产业应用,推动工业、医疗…

张小明 2026/1/17 20:13:12 网站建设

太原网站建设推广服务做运营常用的网站

FaceFusion如何应对低分辨率输入?超分模块加持 在短视频创作、影视特效和AI换脸应用日益普及的今天,一个看似不起眼却极具挑战性的问题正频繁浮现:当源视频或目标图像分辨率极低时,换脸结果为何总是模糊、失真甚至“面目全非”&am…

张小明 2026/1/17 20:13:13 网站建设

济南上门做睫毛的网站公司网站的具体步骤

第一章:Open-AutoGLM毫秒级响应的底层架构解析Open-AutoGLM 实现毫秒级推理响应的核心在于其高度优化的异步执行引擎与分层缓存机制。该架构通过解耦模型加载、请求调度与计算执行三个关键流程,显著降低了端到端延迟。异步推理管道设计 系统采用基于事件…

张小明 2026/1/17 20:13:13 网站建设

定制网站建设哪家便宜做外贸上阿里巴巴什么网站

Pandoc文档转换工具:一站式解决多格式文档处理难题 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 想要实现Markdown到Word、PDF到HTML等各种格式间的无缝转换?Pandoc正是你需要的强大…

张小明 2026/1/17 20:13:14 网站建设

江苏省建设厅官方网站建一个网站都需要什么

大三学长毕业设计救星:原生JS大文件传输系统(附完整代码) 兄弟,作为刚摸爬滚打完毕设的通讯专业学长,太懂你现在的处境了——找工作要作品,大文件上传需求卡壳,网上开源代码全是“断头路”&…

张小明 2026/1/17 20:13:14 网站建设

如何做网站搜索优化鄂州seo

用 DDU 彻底重装显卡驱动:游戏本性能回归的终极秘籍你有没有遇到过这样的情况?明明刚更新了最新的 NVIDIA 驱动,结果《赛博朋克2077》一进城市就帧数暴跌;或者外接显示器死活检测不到,设备管理器里还跳出个未知设备&am…

张小明 2026/1/17 20:13:15 网站建设