小企业网站维护什么东西房地产新闻联播

张小明 2026/1/9 17:27:03
小企业网站维护什么东西,房地产新闻联播,seo建设,网络营销简介先简单回顾#xff1a;Validated和Valid的基础区别坑1#xff1a;以为Validated能直接实现嵌套校验#xff0c;结果校验失效错误示例#xff1a;正确做法#xff1a;坑2#xff1a;分组校验用Valid#xff0c;结果分组完全没效果先定义分组接口#xff1a;错误示例Validated和Valid的基础区别坑1以为Validated能直接实现嵌套校验结果校验失效错误示例正确做法坑2分组校验用Valid结果分组完全没效果先定义分组接口错误示例正确做法坑3在方法参数上用Validated做普通校验非Spring环境下失效错误示例普通类非Spring管理正确做法场景1在Spring环境中使用推荐场景2非Spring环境用Valid配合Validator坑4忽略校验异常的捕获返回默认错误页面问题示例正确做法全局异常处理器捕获校验异常坑5以为Validated能同时标记方法和参数实现双重校验错误示例多余的Validated正确做法坑6集合参数校验用Validated结果集合内元素校验完全失效错误示例正确做法总结避开坑的核心要点做Java开发的时候参数校验是必不可少的环节Spring框架里的Validated和Valid两个注解经常被用来做参数校验但这俩注解长得像用法还藏着不少坑。我当初刚用的时候要么是校验不生效要么是分组校验没效果甚至还遇到过嵌套校验失败的情况踩了一堆坑才摸清楚它们的区别和使用禁忌。今天就把这些坑梳理出来再配上代码示例希望能帮大家少走弯路。先简单回顾Validated和Valid的基础区别在说坑之前先快速过一下两者的核心差异这是理解后续内容的基础。我认为这俩注解的本质区别就在于功能范围和所属框架Valid是JSR-303/JSR-380规范里的注解属于javax.validation包功能比较基础主要支持基本的参数校验和嵌套校验。Validated是Spring框架对Valid的扩展属于org.springframework.validation.annotation包在Valid的基础上增加了分组校验和校验组序列的功能还支持对方法参数按类型分组校验。先上一个基础的实体类和接口示例后面的坑都基于这个结构// 实体类用户信息publicclassUser{NotBlank(message用户名不能为空)privateStringusername;Min(value18,message年龄不能小于18岁)privateIntegerage;// 嵌套的实体类收货地址Valid// 用于嵌套校验NotNull(message收货地址不能为空)privateAddressaddress;// 省略getter、setter}// 嵌套的实体类收货地址publicclassAddress{NotBlank(message详细地址不能为空)privateStringdetail;// 省略getter、setter}// 控制器接口RestControllerRequestMapping(/user)publicclassUserController{// 后续示例会在这里写不同的接口方法}坑1以为Validated能直接实现嵌套校验结果校验失效这是我踩过的第一个大坑当时我在嵌套实体类上用了Validated结果嵌套的字段校验完全没反应查了半天才发现嵌套校验只能用ValidValidated不支持嵌套校验的注解标记。错误示例// 错误在嵌套字段上用Validated嵌套校验失效publicclassUser{NotBlank(message用户名不能为空)privateStringusername;// 这里用Validated是错的Address里的NotBlank不会生效ValidatedNotNull(message收货地址不能为空)privateAddressaddress;// 省略getter、setter}// 接口方法PostMapping(/add)publicStringaddUser(ValidatedRequestBodyUseruser){return添加成功;}当传入的User对象中address的detail为null时不会触发“详细地址不能为空”的校验因为Validated不能标记嵌套字段来实现嵌套校验。正确做法// 正确嵌套字段上用Valid才能触发嵌套校验publicclassUser{NotBlank(message用户名不能为空)privateStringusername;// 用Valid标记嵌套字段Address里的校验规则会生效ValidNotNull(message收货地址不能为空)privateAddressaddress;// 省略getter、setter}这时候再传入address.detail为null的User对象就会触发嵌套校验返回对应的错误信息。我认为这个坑的本质是混淆了两个注解的定位Valid是规范注解负责基础的校验包括嵌套Validated是Spring扩展负责增强功能分组但不替代Valid的嵌套功能。坑2分组校验用Valid结果分组完全没效果分组校验是业务中很常见的场景比如新增用户时不需要校验id修改用户时必须校验id。很多人会想当然地用Valid来做分组校验结果发现分组规则完全不生效——因为**Valid不支持分组校验只有Validated能实现分组校验**。先定义分组接口// 新增用户的分组publicinterfaceAddGroup{}// 修改用户的分组publicinterfaceUpdateGroup{}错误示例// 实体类给id添加修改分组的校验publicclassUser{Null(message新增用户时id必须为空,groupsAddGroup.class)NotNull(message修改用户时id不能为空,groupsUpdateGroup.class)privateLongid;NotBlank(message用户名不能为空,groups{AddGroup.class,UpdateGroup.class})privateStringusername;// 省略其他字段和getter、setter}// 接口方法用Valid做分组校验错误PostMapping(/add)publicStringaddUser(Valid({AddGroup.class})RequestBodyUseruser){// 这里会编译报错因为Valid没有groups参数return添加成功;}首先Valid注解根本没有groups参数写代码时会直接编译报错就算勉强去掉groups参数用Valid标记分组规则也不会生效比如新增用户时id不为null也不会触发“新增用户时id必须为空”的校验。正确做法// 接口方法用Validated做分组校验正确PostMapping(/add)publicStringaddUser(Validated(AddGroup.class)RequestBodyUseruser){return添加成功;}PostMapping(/update)publicStringupdateUser(Validated(UpdateGroup.class)RequestBodyUseruser){return修改成功;}用Validated加上分组类就能精准触发对应分组的校验规则。比如调用/add接口时会触发AddGroup的校验id不为null就会返回错误调用/update接口时会触发UpdateGroup的校验id为null就会返回错误。坑3在方法参数上用Validated做普通校验非Spring环境下失效有一次我在普通的Service类没有被Spring管理里给方法参数加了Validated做校验结果发现完全没反应。后来才知道Validated是Spring的注解它的校验功能依赖于Spring的AOP机制只有在Spring管理的Bean中如Controller、Service、Component才会生效而Valid是JSR规范注解配合javax.validation.Validator可以在任何环境下生效。错误示例普通类非Spring管理// 普通类没有加Component不是Spring BeanpublicclassUserService{// 用Validated校验参数失效publicvoidsaveUser(ValidatedUseruser){System.out.println(保存用户user.getUsername());}}// 测试代码publicclassTest{publicstaticvoidmain(String[]args){UserServiceservicenewUserService();UserusernewUser();user.setUsername();// 违反NotBlank规则service.saveUser(user);// 不会触发校验直接执行方法}}这段代码里UserService不是Spring BeanValidated的校验完全失效就算参数不符合规则方法也会正常执行。正确做法场景1在Spring环境中使用推荐给类加上Component注解让Spring管理// 加上Component成为Spring BeanComponentpublicclassUserService{// Validated生效publicvoidsaveUser(ValidatedUseruser){System.out.println(保存用户user.getUsername());}}场景2非Spring环境用Valid配合Validatorimportjavax.validation.Validation;importjavax.validation.Validator;importjavax.validation.ValidatorFactory;publicclassUserService{// 手动获取ValidatorprivatestaticfinalValidatorvalidator;static{ValidatorFactoryfactoryValidation.buildDefaultValidatorFactory();validatorfactory.getValidator();}publicvoidsaveUser(ValidUseruser){// 手动执行校验SetConstraintViolationUserviolationsvalidator.validate(user);if(!violations.isEmpty()){// 处理校验错误thrownewIllegalArgumentException(violations.iterator().next().getMessage());}System.out.println(保存用户user.getUsername());}}// 测试代码publicclassTest{publicstaticvoidmain(String[]args){UserServiceservicenewUserService();UserusernewUser();user.setUsername();// 违反NotBlank规则service.saveUser(user);// 抛出异常提示“用户名不能为空”}}我们的经验是在实际项目中大部分场景都是Spring环境所以用Validated足够但如果是工具类、普通Java项目就需要用Valid配合手动校验。坑4忽略校验异常的捕获返回默认错误页面很多人在Controller里加了Validated/Valid但没处理校验失败的异常结果前端收到的是默认的错误页面或500错误体验很差。这其实不算注解本身的坑但却是使用时最容易忽略的问题。问题示例PostMapping(/add)publicStringaddUser(ValidatedRequestBodyUseruser){return添加成功;}当参数不符合规则时Spring会抛出MethodArgumentNotValidException异常如果没捕获前端会收到一堆堆栈信息不是友好的提示。正确做法全局异常处理器捕获校验异常importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.validation.BindingResult;importorg.springframework.validation.FieldError;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjava.util.HashMap;importjava.util.Map;// 全局异常处理器RestControllerAdvicepublicclassGlobalExceptionHandler{// 捕获参数校验异常ExceptionHandler(MethodArgumentNotValidException.class)publicResponseEntityMapString,StringhandleValidException(MethodArgumentNotValidExceptione){MapString,StringerrorMapnewHashMap();BindingResultbindingResulte.getBindingResult();// 遍历所有错误封装成键值对for(FieldErrorfieldError:bindingResult.getFieldErrors()){errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());}returnnewResponseEntity(errorMap,HttpStatus.BAD_REQUEST);}}这样一来校验失败时前端会收到清晰的错误信息比如{“username”:“用户名不能为空”}而不是默认的错误页面。坑5以为Validated能同时标记方法和参数实现双重校验有一次我想让方法级别的校验和参数校验都生效就同时在方法上和参数上加了Validated结果发现完全没必要还可能导致重复校验。其实**Validated只需要标记在类上或方法参数上即可标记在方法上不会触发额外的校验**。错误示例多余的ValidatedPostMapping(/add)Validated// 这里的Validated多余不会起作用publicStringaddUser(ValidatedRequestBodyUseruser){return添加成功;}这里方法上的Validated是多余的参数上的Validated已经能触发校验方法上的注解不会带来任何额外效果反而让代码显得冗余。正确做法只在参数上标记Validated或Valid即可除非是做方法级别的分组校验比如对方法的多个参数按分组校验才需要在类上标记Validated。坑6集合参数校验用Validated结果集合内元素校验完全失效这是我第一次用集合校验时栽的大坑相信很多人也遇到过当参数是List、Set这类集合里面装的是需要校验的实体类时用Validated标记参数集合内的元素校验完全不生效必须用Valid才行。错误示例// 接口方法集合参数用Validated元素校验失效PostMapping(/batchAdd)publicStringbatchAddUser(ValidatedRequestBodyListUseruserList){return批量添加成功;}当传入的userList中有用户的username为空或age小于18时校验规则完全没触发直接执行方法逻辑这就是因为集合参数的校验不能用Validated标记。正确做法// 接口方法集合参数用Valid才能触发内部元素的校验PostMapping(/batchAdd)publicStringbatchAddUser(ValidRequestBodyListUseruserList){return批量添加成功;}我认为这个坑的本质是Validated主要针对参数的整体做分组等增强校验而Valid能深入到集合内部对每个元素执行嵌套/实体级别的校验。如果需要同时实现集合元素校验和分组校验可以把Validated标记在类上参数上用Valid// 控制器类上标记Validated支持分组参数上用Valid触发集合元素校验RestControllerRequestMapping(/user)ValidatedpublicclassUserController{// 集合参数分组校验Valid触发元素校验AddGroup触发分组规则PostMapping(/batchAdd)publicStringbatchAddUser(ValidRequestBodyListUseruserList,BindingResultresult){// 也可以结合分组比如Validated(AddGroup.class)标记在类上参数用Validreturn批量添加成功;}}补充一句要是集合参数还需要分组校验正确的写法是在控制器类上添加Validated(分组类.class)参数上保留Valid这样既能触发集合内元素的校验又能生效分组规则。总结避开坑的核心要点梳理了这么多坑我认为只要记住以下几个核心点就能轻松避开Validated和Valid的大部分问题嵌套校验用Valid嵌套实体类的字段上必须用Valid标记Validated替代不了。分组校验用Validated只有Validated支持groups参数Valid不支持。Validated依赖Spring环境非Spring管理的类用Valid配合手动校验。必须捕获校验异常用全局异常处理器返回友好的错误信息。注解不要冗余使用参数上的Validated/Valid已经足够方法上的注解大多多余。集合参数校验用ValidList、Set等集合参数要标记Valid才能触发内部元素的校验Validated做不到。其实这两个注解的坑本质上都是因为没搞清楚它们的定位和适用场景。只要记住“Valid管基础校验嵌套、集合元素Validated管增强功能分组前者是规范后者是Spring扩展”再结合实际场景多测试就能用得游刃有余。如果有哪里理解不到位的地方欢迎大家指正呀
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

企业注册阿里账号网站建设网站推广策划思路的内容

计算机大学生找工作:选网络安全,比做传统程序员更 “香” 的 5 个核心理由 作为计算机专业的学生,你可能正面临一个经典困惑:毕业找工作,是随大流选 Java/Python 开发,还是选近几年火热的网络安全&#xff…

张小明 2025/12/24 8:43:38 网站建设

各网站特点手机优化

还在为复杂的YOLO命令行参数而烦恼吗?YOLOSHOW为您带来了革命性的目标检测体验,通过直观的图形界面让YOLO算法变得触手可及。这款基于PySide6开发的免费工具,集成了从YOLOv5到YOLOv11以及RT-DETR、SAM等先进算法,真正实现了"…

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

知乎网站内容建设的逻辑智慧旅游网站建设方案ppt

文本格式化与打印工具全解析 在处理文本时,格式化和打印是常见的需求。本文将详细介绍一些实用的文本格式化和打印工具,包括它们的功能、使用方法以及应用场景。 简单格式化工具 pr - 用于打印的文本分页 pr 程序主要用于对文本进行分页处理。在打印文本时,我们通常希望…

张小明 2026/1/3 5:44:46 网站建设

河南网站建设推荐查询企业信息的官方网站

第一章:Open-AutoGLM自动化测试实战(兼容性验证黄金标准)在现代软件交付体系中,确保模型驱动型应用的跨平台一致性是质量保障的核心环节。Open-AutoGLM 作为专为 GLM 系列大模型设计的自动化测试框架,提供了标准化的兼…

张小明 2026/1/2 17:30:03 网站建设

网站建设合伙合同范本上海市建设人才网站

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 小程序springboot茶益游 茶叶茶友圈文化分享交流App 的设…

张小明 2025/12/24 8:38:23 网站建设