让你的代码更高效!-API接口参数验证的必备神器 (如何让代码更健壮)
环境:Springboot2.6.12
1.简介
SpringValidation是一种轻量级的数据验证框架,关键用于对对象启动校验。它为数据验证提供了一致的接口和基本的校验性能,处置了数据校验这一经常出现疑问,让开发人员能够繁难地对数据启动验证,从而保障数据的有效性和安保性。
SpringValidation提供了一套注解,用于对Java对象启动校验,允许嵌套校验和分组校验,允许国内化和自定义注解和校验器,可以满足各种复杂的校验需求。它的关键特点包括:
BeanValidation为Java运行程序提供了一种经过解放申明和元数据启动验证的通用方法。要经常使用它,只有要对POJO属性启动注释,而后由运转时强迫口头这些解放。有内置的解放,你也可以定义自己的自定义解放。如下所示:
publicclassPerson{@NotNull@Size(max=64)privateStringname;@Min(0)privateintage;}
Bean验证验证器而后依据申明的解放验证此类的实例。无关API的普通讯息,请参见Bean验证。无关特定解放,请参阅Hibernate验证程序言档。
性能Bean验证提供程序
Spring提供了对Bean验证API的片面允许,包括将Bean验证提供者作为SpringBean。这使你可以在运行程序中须要验证的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。
你可以经常使用LocalValidatorFactoryBean将自动验证器性能为SpringBean,如下例所示:
importorg.springframework.validation.beanvalidation.LocalValidatorFactoryBean;@ConfigurationpublicclassConfig{@BeanpublicLocalValidatorFactoryBeanvalidator(){returnnewLocalValidatorFactoryBean();}}
上方的示例中的基本色能经常使用自动疏导机制触发bean验证启动初始化。Bean验证提供程序(如Hibernate验证程序)应该出如今类门路中,并被智能检测到。
2.注入Validator
@ServicepublicclassPersonService{//injectjavaeevalidatorobject@ResourceprivateValidatorvalidator;//injectspringvalidatorobject@Resourceprivateorg.springframework.validation.Validatorvalid;}
繁难实例
接着上方的性能,咱们只有要做验证举措即可。
@ServicepublicclassPersonService{@ResourceprivateValidatorvalidator;@Resourceprivateorg.springframework.validation.Validatorvalid;publicvoidvalidator(Personperson){Set<ConstrntViolation<Person>>res=validator.validate(person);res.forEach(cv->{System.out.println(cv.getMessage());});System.out.println("----------------------");BindingResulterrors=newMapBindingResult(newHashMap<String,Object>(),"person");valid.validate(person,errors);if(errors.hasErrors()){errors.getAllErrors().forEach(oe->{System.out.println(oe.getDefaultMessage());});}}}
测试
@SpringBootTestclassSpringBootValidationApplicationTests{@ResourceprivatePersonServiceps;@TestpublicvoidtestValidator(){Personperson=newPerson();person.setAge(-1);ps.validator(person);}}
最小不能小于0不能为null----------------------最小不能小于0不能为null
3.自定义注解验证
每个Bean验证解放由两局部组成:
要将申明与成功关联,每个@Constraint注释都会援用相应的ConstraintValidator成功类。在运转时,当域模型中遇到解放注释时,ConstraintValidatorFactory将实例化援用的成功。上方的示例成功一个前缀婚配的验证逻辑:
自定义注解
@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy=PrefixConstraintValidator.class)public@interfacePrefixConstraint{Stringvalue()default"";//这里的{validator.prefix.error}就是资源文件中定义的失误信息Stringmessage()default"{validator.prefix.error}";Class<?>[]groups()default{};Class<?extendsPayload>[]payload()default{};}
以上的注解属性都是必定的。
留意message属性是咱们将出现失误后失误信息定义在性能文件中,而该文件的basename必定是ValidationMessages,假设你须要国内化允许,那么就这样命名:ValidationMessages_zh_CN.properties。
自定义验证器
publicclassPrefixConstraintValidatorimplementsConstraintValidator<PrefixConstraint,CharSequence>{@Resourceprivate>@BeanpublicMethodValidationPostProcessorvalidationPostProcessor(){returnnewMethodValidationPostProcessor();}@Service@ValidatedpublicclassPersonService{@NotNull(message="前往值不能为空")publicPersonfindPerson(@NotEmpty(message="ID不能为空")Stringid){returnnull;}}
留意:类上必定有@Validated注解;由于上方的BeanPostProcessor中定义的Advisor(DefaultPointcutAdvisor)经常使用的切入的Pointcut在类级别上过滤条件是必定有@Validated注解,而办规律是阻拦一切的方法。
测试
这里是抛出的意外javax.validation.ConstraintViolationException,一切咱们须要一个全局的意外阻拦器来对意外做处置。
其余性能选项
自动的LocalValidatoryFactoryBean性能关于大少数状况都足够了。关于各种Bean验证结构,有许多性能选项,从信息插值到遍历解析。无关这些选项的更多信息,请参阅LocalValidatorFactoryBeanJavadoc。
让你的代码更有逼格之23种设计模式总结
在编程的世界里,提升代码的艺术感和效率是每个开发者追求的目标。设计模式就像编程艺术的调色板,为我们的代码结构增添了丰富性和可维护性。它们按照创建型、结构型和行为型三大类别,囊括了23种经典模式,帮助我们构建更稳定、高效且易于理解和复用的软件架构。
每种模式都有其独特的价值,从单例模式的资源管理,到访问者模式的结构灵活性,都是提升代码质量的有力工具。掌握并灵活运用这些设计模式,你的代码将展现出更高的逼格,不仅易于理解和维护,还能在复杂系统中游刃有余。
访问者模式: 以结构不变,应对结构变化,通过Visitor、ConcreteVisitor、Element、ConcreteElement和ObjectStructure的角色,实现数据结构和操作的解耦。
模板方法模式: 基于继承的代码复用策略,提供基础流程,子类可自定义部分,抽象类(AbstractClass)和实现类(ConcreteClass)共同构建框架。
策略模式: 算法的灵活性和选择性,通过Context、Strategy和ConcreteStrategy的角色,支持不同的行为策略。
状态模式: 状态驱动的行为变化,Context、State和ConcreteState的角色共同定义对象在不同状态下的行为。
观察者模式: 一对多的依赖关系,当目标改变时,观察者得到通知,保持了目标与观察者之间的独立性。
备忘录模式: 保存对象状态的关键技术,Originator、Memento和Caretaker的角色共同实现可恢复状态的功能。
中介者模式: Mediator抽象中介者协调Colleague(抽象同事类)间的交互,简化了复杂关系。
迭代器模式: Iterator抽象迭代器与Aggregate、ConcreteAggregate角色,实现对象元素的有序访问。
解释器模式: 解析和执行抽象表达式,通过AbstractExpression、TerminalExpression、NonterminalExpression和Context的角色,提供动态解析和执行的能力。
在你的代码旅程中,运用这些设计模式,将让你的代码结构更清晰,逻辑更严谨,从而提升代码的逼格和整体效能。
好学编程:吐血整理!当代程序员必备的神器大全
在程序员的宝库中,有一份精心筛选的神器清单,它们犹如得力助手,助力你提升开发效率。 以下是专为当代码农打造的必备工具集合,涵盖开发环境、远程协作、浏览器扩展、数据库管理到API调试的方方面面:1. IntelliJ IDEA (Java IDE) - 作为Java开发的首选,它提供了强大的代码支持和智能化的项目管理。 2. SecureCRT (SSH终端) - 保障你的远程连接安全,无缝切换到SSH工作模式。 3. Termius (全平台远程终端) - 跨平台的远程控制利器,简化你的多设备连接操作。 4. Google Chrome (浏览器) - 浏览器中的开发者工具箱,为前端开发者提供无尽可能。 5. iTerm (Mac OS X终端) - 专为Mac用户设计的高效终端,操作简便。 6. Visual Studio Code (跨平台源代码编辑器) - 具有众多实用扩展,如AWS Toolkit、ESLint和Live Server,提升开发效率。 - 诸如Docker等插件,助力你实现快速部署和容器化工作。 7. VMware Fusion/Workstation (虚拟机管理) - 为多环境开发提供强大支持,轻松管理虚拟机。 8. Navicat Premium (数据库管理) - 轻松管理数据库,无论是MySQL还是Oracle,都得心应手。 9. Postman (API调试) - API开发的得力助手,调试和测试一手掌握。 10. RedisDesktopManager (Redis管理) - 简化Redis的本地管理,提高数据操作效率。 11. Dash (API文档浏览器) - 实时查阅API文档,提高开发速度。 这些工具的强大之处在于它们的高度集成和定制化,旨在为你提供一站式解决方案。 在线搜索库包括200+ API文档,离线模式下还有100+备忘单,以及更多功能。 探索抓包与调试的神器:- Fiddler/Wireshark:揭示网络通信的神秘面纱。 - HBuilder X:HTML5开发利器,智能代码助手,集成IDE与编辑器。 - MobaXterm:远程终端控制,集成了多种网络协议工具。 从文本编辑器到专业HTML编辑器:- Sublime Text:跨平台的轻量级编辑器。 - WebStorm:专业HTML编辑工具,支持多元开发。 SSH客户端的佼佼者:- Xshell:功能丰富的SSH客户端,为你的远程连接保驾护航。 - SwitchHosts:Hosts文件管理工具,切换网络环境轻而易举。 还有智能命名解决方案:- CodeIf:智能代码命名工具,解决命名难题。 文档搜索和资源库:- 印记中文:中文前端文档大全,对英文不熟悉的你来说是福音。 - any-rule:正则表达式全攻略,多平台可用。 - :无需安装的在线编程工具,简化开发环境。 从CDN服务到Markdown编写工具:- Baomitu:HTTP/2 CDN,为小型项目提供快速入口。 - Typora-Markdown:程序员的Markdown编写首选,高效且简洁。 抓图与视频处理工具:- Snipaste:强大截图软件,操作便捷。 - Captura:开源录屏与GIF工具,解码全能。 远程协作利器:- 向日葵:跨平台的远程控制软件,团队协作的得力助手。 还有更多工具等待你的发掘:- Everything:快速文件搜索,体积虽小,功能强大。 - StarUML:UML绘图神器,提升项目设计效率。 - uTools:生产力工具集合,插件丰富。 最后,探索这些在线资源,以提升你的技术搜索能力:- Bing:搜索引擎的选择,比某些选项更出色。 - DuckDuckGo:无广告且注重隐私,理想选择。 - Stack Overflow:技术问答的首选,替代搜索引擎。 - Gitlogs:GitHub项目的专属搜索引擎。 - jiumo search:技术文档的专属搜索引擎。 阅读和学习的宝藏:- Ebooke:免费电子书搜索引擎,扩展你的知识库。 - Iconfinder:寻找专业logo的乐园。 - TinEye:图片搜索神器,支持上传或输入链接。 总之,这个神器清单是你成为高效程序员的坚实基础。 不断探索和学习,你将发现更多编程世界的精彩。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。