金融网站织梦模板非洲外贸网站

张小明 2026/3/13 7:39:56
金融网站织梦模板,非洲外贸网站,苗木网站什么做,登陆插件wordpress自定义校验注解 实现自定义校验注解#xff0c;本质上是遵循 JSR-303/JSR-380 (Bean Validation) 规范。 在 Spring Boot 中实现它#xff0c;只需要 两步走#xff1a; 定义注解#xff08;接口#xff09;#xff1a;相当于制定法律条款。定义校验器#xff08;实现…自定义校验注解实现自定义校验注解本质上是遵循JSR-303/JSR-380 (Bean Validation)规范。在 Spring Boot 中实现它只需要两步走定义注解接口相当于制定法律条款。定义校验器实现类相当于执法警察负责执行逻辑。我们以一个经典的实战场景为例“校验某个字段不能包含空格”命名为NoSpace。第一步定义注解 (NoSpace)我们需要创建一个注解接口并在上面加上Constraint注解来绑定它的“执行者”。packagecom.example.common.validation;importjavax.validation.Constraint;importjavax.validation.Payload;importjava.lang.annotation.*;Target({ElementType.FIELD,ElementType.PARAMETER})// 1. 作用在字段或参数上Retention(RetentionPolicy.RUNTIME)// 2. 运行时生效Documented// 3. 【核心】指定这就注解由哪个类来负责校验逻辑Constraint(validatedByNoSpaceValidator.class)publicinterfaceNoSpace{// 4. 默认错误提示信息Stringmessage()default不能包含空格;// 5. 分组校验用必须有Class?[]groups()default{};// 6. 负载数据必须有虽然平时很少用Class?extendsPayload[]payload()default{};}第二步定义校验器 (NoSpaceValidator)这个类必须实现ConstraintValidator注解, 字段类型接口。关键点这个类会被 Spring 容器管理所以你在里面可以使用Resource注入 Servicepackagecom.example.common.validation;importjavax.validation.ConstraintValidator;importjavax.validation.ConstraintValidatorContext;// 泛型参数1绑定的注解// 泛型参数2要校验的数据类型 (这里是 String)publicclassNoSpaceValidatorimplementsConstraintValidatorNoSpace,String{Overridepublicvoidinitialize(NoSpaceconstraintAnnotation){// 初始化方法如果注解里有参数比如 max10可以在这里获取并存起来}/** * 校验逻辑的核心 * param value 前端传进来的值 (比如 zhang san) * param context 上下文 * return true通过, false失败 */OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){// 1. 最佳实践如果是 null直接返回 true。// 因为“非空校验”应该交给 NotNull 去做我们只负责“格式校验”。// 这样可以实现“选填但填了就不能有空格”的效果。if(valuenull){returntrue;}// 2. 校验逻辑判断是否包含空格return!value.contains( );}}第三步在 VO 中使用现在你可以在你的UserSaveReqVO里使用它了就像使用NotNull一样。DatapublicclassUserSaveReqVO{Schema(description用户名)NotBlank(message用户名不能为空)// 标准注解NoSpace(message用户名里别搞空格后端处理麻烦)// ✅ 你的自定义注解privateStringusername;}第四步在 Controller 中触发这一步和普通校验一模一样不需要做任何特殊修改。只要加上Valid或ValidatedSpring 就会自动发现你的自定义注解并执行校验器。PostMapping(/create)publicCommonResultLongcreateUser(ValidRequestBodyUserSaveReqVOreqVO){// 如果 username 是 zhang san这里进不来// 会抛出 MethodArgumentNotValidException// 你的 GlobalExceptionHandler 会捕获它并返回 用户名里别搞空格后端处理麻烦returnsuccess(userService.createUser(reqVO));} 进阶技巧如何注入 Service 查询数据库自定义注解最强大的地方在于校验器 (Validator) 是受 Spring 管理的 Bean。场景自定义一个UniqueUsername注解校验用户名是否已存在。校验器写法publicclassUniqueUsernameValidatorimplementsConstraintValidatorUniqueUsername,String{Resource// ✅ 直接注入 Mapper 或 ServiceprivateUserMapperuserMapper;OverridepublicbooleanisValid(Stringusername,ConstraintValidatorContextcontext){if(usernamenull)returntrue;// 直接查数据库UserDOuseruserMapper.selectByUsername(username);// 如果查到了说明重复了校验失败 (false)returnusernull;}}ConstraintValidatorContext 的作用ConstraintValidatorContext是 Bean Validation校验框架提供给你的一个“控制台”或“案情报告单”。在isValid方法中value是你要校验的嫌疑人而context就是你手中的笔和罚单本。它主要有两大核心作用改写错误文案你不满意注解里默认写的message想根据具体情况动态修改报错信息。修改错误指向重要特别是在类级别校验多字段联合校验时你想把错误精确地挂在某一个具体的字段上而不是挂在整个对象上。下面我通过两个具体的实战场景来演示。场景一动态修改错误提示 (改写文案)需求你写了一个CheckPassword注解。如果密码太短你想报“密码长度不够”。如果密码太简单你想报“密码必须包含大写字母”。但是注解上的message只能写死一句话。**怎么做**利用context禁用默认提示手写新的提示。publicclassPasswordValidatorimplementsConstraintValidatorCheckPassword,String{OverridepublicbooleanisValid(Stringpassword,ConstraintValidatorContextcontext){if(passwordnull)returntrue;// 1. 检查长度if(password.length()6){// 【核心动作】// A. 禁用掉注解里默认定义的 messagecontext.disableDefaultConstraintViolation();// B. 手动添加一条新的错误信息context.buildConstraintViolationWithTemplate(密码长度不能少于6位).addConstraintViolation();returnfalse;}// 2. 检查复杂度if(!password.contains()){// 【核心动作】context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(密码必须包含特殊字符 ).addConstraintViolation();returnfalse;}returntrue;}}场景二类级别校验指哪打哪 (修改指向)这是ConstraintValidatorContext最不可替代的作用需求你要校验UserReqVO中的password和confirmPassword是否一致。这是一个跨字段的逻辑所以注解PasswordMatch必须加在类Class上而不是字段上。问题如果你直接返回falseSpring 会认为错误发生在UserReqVO这个对象上而不是confirmPassword这个字段上。前端收到错误时无法把红框标在“确认密码”的输入框旁边用户体验很差。怎么做利用context把错误“重定向”到具体字段。VO 代码PasswordMatch// 注解加在类上publicclassUserRegisterReqVO{privateStringpassword;privateStringconfirmPassword;}校验器代码publicclassPasswordMatchValidatorimplementsConstraintValidatorPasswordMatch,UserRegisterReqVO{OverridepublicbooleanisValid(UserRegisterReqVOvo,ConstraintValidatorContextcontext){if(vo.getPassword()null||vo.getConfirmPassword()null){returntrue;}// 如果不一致if(!vo.getPassword().equals(vo.getConfirmPassword())){// 1. 禁用默认报错因为它会报在 UserRegisterReqVO 对象头上context.disableDefaultConstraintViolation();// 2. 【核心黑科技】建立一个新的报错并指向 confirmPassword 字段context.buildConstraintViolationWithTemplate(两次输入的密码不一致)// 设置文案.addPropertyNode(confirmPassword)// 指向字段名.addConstraintViolation();// 完成添加returnfalse;}returntrue;}}效果前端收到的 JSON 中错误的 key 不再是userRegisterReqVO而是精确的confirmPassword。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

旅游网站繁体asp海宁网站网站建设

Qwen3-8B大模型快速上手与部署实践 在消费级硬件上跑通一个真正“能思考”的大模型,曾经是许多开发者的奢望。但随着 Qwen3-8B 的发布,这一目标变得触手可及——它不仅能在 RTX 4060 上流畅运行,还能处理长达 32K token 的上下文&#xff0c…

张小明 2026/3/5 5:17:59 网站建设

百度营销-网站分析培训工伤保险网上做实网站

Qwen2.5-VL-3B-Instruct-AWQ深度解析:多模态AI的突破性进展与实践教程 【免费下载链接】Qwen2.5-VL-3B-Instruct-AWQ 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-VL-3B-Instruct-AWQ 在Qwen2-VL模型问世五个月以来,全球开发者社…

张小明 2026/3/5 5:17:59 网站建设

wordpress字体编辑器网站建设备案优化

ARP扫描工具arp-scan:局域网设备发现完全指南 【免费下载链接】arp-scan The ARP Scanner 项目地址: https://gitcode.com/gh_mirrors/ar/arp-scan 想要快速发现局域网中所有设备?ARP扫描工具arp-scan就是你的最佳选择。这款专为网络设备发现设计…

张小明 2026/3/5 5:18:02 网站建设

站内优化seo河北住房和城乡建设厅官方网站

第一章:为什么你的Open-AutoGLM卡成幻灯片?这4个资源占用陷阱你一定中招了 在部署 Open-AutoGLM 模型时,许多开发者发现推理过程异常缓慢,甚至像播放幻灯片一样逐帧输出。这通常不是模型本身的问题,而是资源管理不当引…

张小明 2026/3/5 5:18:03 网站建设

python做软件的网站企业网站模板湖南岚鸿模板

�� 论文查重工具核心特点对比 工具名称 查重速度 数据库覆盖 价格区间 适用场景 特色功能 AIcheck 极快 超全 中高 深度查重/学术规范检测 实时降重/AIGC检测 知网 中等 最全 高 终稿定稿查重 高校认可度高 维普 快 较全 中 中期查…

张小明 2026/3/10 3:43:31 网站建设