bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

ff2590fa24c339eb24355876c7968821.png

1. 概述

在项目实际开发过程中,为了更好的复用,我们参考Spring Boot Starters,封装了许多企业内部中间件的starter。这些中间件的接入都需要申请并在项目中配置一些特定的参数。我们通过@ConfigurationProperties注解,增加了在配置过程的体验,实现属性提示。一些参数是在中间件使用过程中的必选参数,经常发现项目启动了,调用中间件时抛出异常,提示某个参数没有配置。

这样的接入过程体验很不好。

有没有一种方式在项目启动的时候就对配置的参数直接进行校验,而不是等到实际使用的时候再抛出错误提示呢?

很幸运,Spring已经为我们提供的Java Validation可以解决我们的问题。

2. 增加启动校验

在我们创建的Properties类中增加Validation相关配置:

/** * ConfigProperties. * * @author Wang Jianchao(tinyking) * 

 * Created on 2020/8/20 */@Validated@Data@ConfigurationProperties(prefix = "config")public class ConfigProperties {    @NotEmpty    private String name;}

@Validated是Spring提供的校验注解,通过该注解告诉Spring这个类是需要进行校验处理的。

@NotEmpty 是Java Validation API中提供的校验注解,表示name字段不能为空。不能为空是指不能是null,也不能是空字符串。

配置Bean

@Configuration@EnableConfigurationProperties(ConfigProperties.class)public class ValidationConfiguration {    @Bean    public ConfigProperties configProperties() {        return new ConfigProperties();    }}

上面的配置就会校验我们在application.yml中有没有配置config.name参数。如果在配置文件中没有该配置,项目启动就会失败,并抛出校验异常:

***************************APPLICATION FAILED TO START***************************Description:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:    Property: config.name    Value: null    Reason: 不能为空

在application.yml中,我们增加config.name等配置项,但是不给它设置内容:

config:name: 

再次启动项目,发现错误信息发生了变化:

***************************APPLICATION FAILED TO START***************************Description:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:    Property: config.name    Value:     Origin: class path resource [application.yml]:2:8    Reason: 不能为空Action:Update your application's configuration

3. 自定义校验

Spring还支持我们进行自定义校验规则,通过自定义校验可以实现复杂的校验逻辑。

我们创建一个校验类,并实现Validator接口:

/** * ConfigPropertiesValidator. * * @author Wang Jianchao(tinyking) * 

 * Created on 2020/8/20 */public class ConfigPropertiesValidator implements Validator {    @Override    public boolean supports(Class> aClass) {        return ConfigProperties.class.isAssignableFrom(aClass);    }    @Override    public void validate(Object target, Errors errors) {        ConfigProperties config = (ConfigProperties) target;        if (!StringUtils.isEmpty(config.getName()) && config.getName().length() 

需要注意的是,上面的Validator接口是Spring框架提供的,不是Java Validation API中的接口。

  • supports(Class> aClass)方法用来判断是否支持当前正在进行校验的实例
  • validate(Object target, Errors errors)方法中写实际的校验规则,并用errors收集错误信息

接下来就是如何在Spring Boot启动时,对Properties进行校验了。这一步非常关键!

    @Bean    public static ConfigPropertiesValidator configurationPropertiesValidator() {        return new ConfigPropertiesValidator();    }

其中有两个注意点:

  • 方法名必须为configurationPropertiesValidator ,否则在启动的时候不会执行该校验
  • 方法必须声明为static, 告诉Spring,该Bean的创建要在所有的Configuration之前

我们修改在application.yml中config.name:

config: name: a 

这样,name长度就不能满足我们自定义的校验规则,启动程序,查看结果:

***************************APPLICATION FAILED TO START***************************Description:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:    Property: config.name    Value: a    Origin: class path resource [application.yml]:2:9    Reason: name is too shotAction:Update your application's configuration

错误信息即为我们自定义校验的结果。

4. 结论

通过配置Spring Boot启动校验功能,可以快速的识别参数配置的错误,使我们在开发过程中有更好starter集成体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进一步理解:inline-block,vertical-align,line-height

看似三个最常见的概念背后却隐藏了很深的很深“水” 那有多深呢&#xff0c;先来看下面的代码 引出问题 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系统——黑屏问题

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此贴大部分内容源自魔趣论坛V大的帖子&#xff0c;本人经过整理后发出&#xff0c;特此声明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此贴献给小白们&#xff0c;老鸟一笑而过吧近期有…

java executor_Java并发编程(08):Executor线程池框架

一、Executor框架简介1、基础简介Executor系统中&#xff0c;将线程任务提交和任务执行进行了解耦的设计&#xff0c;Executor有各种功能强大的实现类&#xff0c;提供便捷方式来提交任务并且获取任务执行结果&#xff0c;封装了任务执行的过程&#xff0c;不再需要Thread().st…

python 查看当前目录_「Python」打包分发工具setuptools学习

❝setuptools是python标准的打包分发工具&#xff0c;它可以将我们编写的python项目打包安装&#xff0c;这样其他同事就可以像调用标准库或python第三方库那样直接使用&#xff1b;也可以将项目上传到Pypi供更多人的下载安装使用。❞1. 项目结构项目结构❝这是一个打包构建好的…

九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 &#xff08;参与算法&面试题交流与讨论&#xff0c;请加群&#xff1a;30382647&#xff09;引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#…

mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

一、数据库结构优化(非常重要)1.1 数据库结构优化目的1、减少数据冗余&#xff1a;(数据冗余是指在数据库中存在相同的数据&#xff0c;或者某些数据可以由其他数据计算得到)&#xff0c;注意&#xff0c;尽量减少不代表完全避免数据冗余&#xff1b;2、尽量避免数据维护中出现…

python git是什么_python爬虫之git的使用

一、简单认识&#xff1a; 1、初始化文件夹为版本控制文件夹&#xff0c;首先建立一个文件夹&#xff0c;进入这个文件夹以后输入git init初始化这个文件夹。2、Git几种位置概念 1、本地代码&#xff1a;本地更改完代码以后&#xff0c;虽然是存放在git的文件夹里面&#xff0c…

产品经理网站数据分析之测量问题现状(二)

本章续接上文&#xff0c;主要讲解流程图的绘制要领&#xff0c;以及示例。 1、基础流程图 基础流程图应该简明扼要地描述出流程的主要结构&#xff0c;在弄清楚流程的起点、终点&#xff0c;以及主要步骤后&#xff0c;按照流程的先后顺序&#xff0c;按照要展示的流程长短比例…

yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置

你好&#xff0c;我是小桔&#xff0c;是一个没有感情的代码崽。今天给大家介绍一下 Git Hooks&#xff0c;相信 Git 大家都在用吧&#xff0c;Git 除了用作版本控制&#xff0c;还有许多高级功能&#xff0c;Git Hooks 就是其中之一。本文环境&#xff1a;Git 版本&#xff1a…

Tiff – 值得你体验一下的可视化的字体对比工具

Tiff 是一款字体对比工具&#xff0c;可视化对比两种字体之间的差异。这是一个工具来帮助比较两种字体&#xff0c;同时学习排版。在这一点上&#xff0c;谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源。由于应用程序使用的一些功能需要 HTML5 和 CSS3 支持&#xff0c;因此请…

[.NET] 建构子中传递子对象的对象

在设计对象继承的时候&#xff0c;父对象建构子会需要一些参数&#xff0c;这些参数可以由子对象建构子透过base关键词来提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

操作系统实验文件管理_系统设计硬核知识(5)——操作系统的文件管理

操作系统对计算机的管理包括两个方面&#xff1a;硬件资源和软件资源。硬件资源的管理包括CPU 的管理、存储器的管理、设备管理等&#xff0c;主要解决硬件资源的有效和合理利用问题。软件资源包括各种系统程序、各种应用程序、各种用户程序&#xff0c;也包括大量的文档材料、…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】...

今天爱分享给大家带来Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】&#xff0c;希望能够帮助到大家。 字典是 Python 语言中唯一的映射类型。映射类型对象里哈希键(键&#xff0c;key)和指向的对象&#xff08;值&#xff0c;value)是多对一的关系&am…

大网高级技术笔记(一)

防伪码&#xff1b;黑发不知勤学早&#xff0c;白首方悔读书迟本章目标&#xff1a;理解消化动态路由协议与OSPF协议并应用于实际工作中。第一章 动态路由协议一、按照路由执行的算法分类距离矢量路由协议&#xff1a;RIP、IGRP链路状态路由协议&#xff1a;OSPE、IS-IS二、RIP…

阿里MySQL读写一致_阿里面试题:如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸出处&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性…

反射小应用之DataTable和ListT互操作

反射小应用之DataTable和List<T>互操作 在程序中&#xff0c;往往会遇到一些小情况&#xff0c;就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中&#xff0c;这样做的一个后果是在日后的的对数据进行”细“操作时&#xff0c;就发现它可能没有L…

python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?

原标题&#xff1a;什么样的人比较适合选择Python开发人工智能技术&#xff1f; 互联网行业最近几年来确实成为了竞相追捧的行业&#xff0c;人工智能、大数据的不断发展让Python开发技术成为了继Java开发之后的又一热门编程语言。我们都知道&#xff0c;想要学习Python开发编程…

excel vba 从入门到精通_VBA词汇-基本元素篇

在公众号发布学习VBA需要哪些基础知识这篇文章后&#xff0c;有朋友给我们留言&#xff0c;希望可以出一份VBA基础的英语知识贴。其实相关的内容我们会在后面所对应知识点一一进行讲解&#xff0c;提前剧透其实会少很多学习未知知识的乐趣哦~ 我们会将所涉及的基础单词和其说明…

openfeign使用_Feign使用基于配置服务发现

之前写了篇《Feign在实际项目中的应用实践总结》Feign在实际项目中的应用实践总结 - 沐风之境 - 博客园​www.cnblogs.com总结了在一般项目中如何使用Feign这个提升开发效率的利器。最近在看Feign的文档的时候发现了之前遗漏的一些点&#xff0c;所以写了这篇文章进行补充。pom…

我笨,但我不傻

2019独角兽企业重金招聘Python工程师标准>>> 威哥说&#xff1a;很多朋友给我留言&#xff0c;在学习的过程中如何坚持下去&#xff0c;关于努力和目标&#xff0c;我想谈谈自己的理解&#xff0c;有不同见解的地方&#xff0c;欢迎留言跟我探讨哈。 if(努力苦逼) r…