【开发篇】二、属性绑定与校验

news2024/12/23 18:59:33

文章目录

  • 1、@ConfigurationProperties自定义Bean属性绑定
  • 2、@EnableConfigurationProperties注解
  • 3、@ConfigurationProperties第三方Bean属性绑定
  • 4、松散绑定
  • 5、常用计量单位
  • 6、数据校验
  • 7、yaml绑定值的坑--关于进制

请添加图片描述

1、@ConfigurationProperties自定义Bean属性绑定

前面读取yaml文件配置时,用过这个注解,先复习下它的用法。首先在yml配置文件中定义个属性:

# spring默认在用server,我加个s刻意回避下,别影响到服务启动
servers:
  hostAddr: http://127.0.0.1
  port: 9527
  timeout: 6000

定义实体类接收这个参数:

OData
@Component  //首先它得是受Spring管控的对象,即Bean,不然我哪怕拿到值,我怎么联系你给你
@ConfigurationProperties("servers")
public class ServerInfo {

	private String hostAddr:
	
	private int port:
	
	private long timeout;
}

接下来看下效果,懒得写UT,再获取IoC容器对象了 ,直接借用启动类run方法返回的IoC对象来获取上面这个Bean

@SpringBootApplication
public class MyApplication{

	public static void main(String[] args){
	
		ConfigurableApplicationContext applicationContext = SpringApplication.run(MyApplication.class,args);
		
		ServerInfo bean = applicationContext.getBean(ServerInfo.class);
		
		System.out.printin(bean);

	}
}

成功:
在这里插入图片描述

@ConfigurationProperties中写你要加载的属性的上一层级的,如果上一层还有父级,则xxx.xx就行。最后,@ConfigurationProperties注解使用时可能有warn信息:

在这里插入图片描述

要解除使用@ConfigurationProperties注释警告,引入以下这个依赖然后IDEA中点Hide隐藏就行:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

2、@EnableConfigurationProperties注解

有个关联知识点:@EnableConfigurationProperties注解,修改上面的代码,启动类上加@EnableConfigurationProperties注解:

@SpringBootApplication
@EnableConfigurationProperties(ServerInfo.class)
public class MyApplication{

	public static void main(String[] args){
	
		ConfigurableApplicationContext applicationContext = SpringApplication.run(MyApplication.class,args);
		
		ServerInfo bean = applicationContext.getBean(ServerInfo.class);
		
		System.out.printin(bean);

	}
}

此时,重启服务报错:excepted single matching bean but found 2

在这里插入图片描述

这里的原因是@EnableConfigurationProperties(ServerInfo.class)指定了ServerInfo.class,就会把这个类的Bean加载进来,而之前ServerInfo类中又用@Component注册了一次。解决报错把@Component注释掉就好。因此:

@EnableConfigurationProperties注解不能与@Component注解同时使用!

@ConfigurationProperties和@EnableConfigurationProperties,前者是做属性绑定的,后者是开启属性绑定,设定对应的目标是谁。

@EnableConfigurationProperties(ServerInfo.class)

后者的好处是可以通过这一行代码清晰看到都有哪些类从yml中读取了属性,使得对于这种类的管理不松散。

3、@ConfigurationProperties第三方Bean属性绑定

以上是给我们自定义的Bean注入属性,那第三方Bean呢?@ConfigurationProperties也可以实现。先写个测试的yml配置:

datasource:
  driverClassName: com.mysql.hhhh  # 我只是测拿数据,不连数据库,驱动随便写

再定义第三方Bean,@SpringBootApplication注解本身往下追就有@Configuration注解,所以这里直接在启动类里定义第三方Bean

@SpringBootApplication
public class MyApplication{

	@Bean
	@ConfigurationProperties(prefix = "datasource")
	public DruidDataSource dataSource(){
		DruidDataSource dataSource = new DruidDataSource();
		return dataSource;
	}

	public static void main(String[] args){
	
		ConfigurableApplicationContext applicationContext = SpringApplication.run(MyApplication.class,args);
		
		DruidDataSource bean = applicationContext.getBean(DruidDataSource.class);
		
		System.out.printin(bean);
		
		System.out.printin(bean.getDriverClassName());

	}
}

运行,属性绑定成功:

在这里插入图片描述

4、松散绑定

@ConfigurationProperties绑定属性支持属性名宽松绑定 ,即:

OData
@Component 
@ConfigurationProperties("servers")
public class ServerInfo {

	private String ipAddress:
	
	private int port:
	
	private long timeout;
}

属性的名字和配置文件的字段不用一模一样,以下配置都是生效的:

  • 驼峰
servers:
  ipAddress: 192.168.1.1
  port: 2345  
  timeout: -1

  • 下划线
servers:
  ip_address: 192.168.1.2
  port: 2345
  timeout: -1

  • 中划线(烤肉串写法,形似 00-0-0-0—,推荐写法)
servers:
  ip-address: 192.168.1.2
  port: 2345
  timeout: -1

  • 常量模式
servers:
  IP_ADDRESS: 192.168.1.2
  port: 2345
  timeout: -1

  • 随便加下划线或者中划线
servers:
  ip-ad-d_rEss: 192.168.1.2
  Port: 2345
  timeout: -1

当然实体类中的属性名也一样:

public class ServerInfo {

	private String ipADDRESS:
	
	private int port:
	
	private long timeout;
}

但@ConfigurationProperties注解的prefix属性,前缀名必须符合命名规范,即仅能使用纯小写字母、数字、下划线作为合法的字符,大写都不行。此外,@Value注解不支持宽松绑定,大小写不一样就会解析失败。

5、常用计量单位

SpringBoot支持JDK8提供的时间与空间计量单位,@DurationUnit和@DataSizeUnit注解标明所在属性的值的单位。还是上面的例子,加个属性serverTimeOut做调试:

servers:
  ipAddress: 192.168.1.1
  port: 2345  
  timeout: -1
  serverTimeOut: 6

此时, serverTimeOut值6的单位是不确定的,实体类中使用一个时间类Duration来接收:

OData
@Component 
@ConfigurationProperties("servers")
public class ServerInfo {

	private String ipAddress:
	
	private int port:
	
	private long timeout;

	private Duration serverTimeOut;
}

打印这个Bean,可以看到0.06s,即默认为ms:

在这里插入图片描述
接下来加注解指定这个属性的单位:


...
@DurationUnit(ChronoUnit.MINUTES)
private Duration serverTimeOut;
...

在这里插入图片描述

同理,还有空间单位,默认单位Byte,可加@DataSizeUnit注解指定:

OData
@Component 
@ConfigurationProperties("servers")
public class ServerInfo {

	private String ipAddress:
	
	private int port:
	
	private long timeout;

	@DurationUnit(ChronoUnit.MINUTES)
	private Duration serverTimeOut;

	@DataSizeUnit(DataUnit.MEGABYTES)
	private DataSize dataSize;
}

6、数据校验

开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API,先导入JSR303的依赖坐标:

<dependency>    
	<groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

然后在需要校验的地方开启数据校验:

//springframework下的
@Valiated

然后给属性加具体的校验规则,相关注解有:

在这里插入图片描述

此时,运行出现报错:

在这里插入图片描述

报错信息为找不到具体的实现,这就和JDBC和mysql驱动是一个意思,有接口,代码能写,但一运行,没有实现,跑不起来。再引入JSR303校验框架的实现,如Hibernate:

<dependency>    
	<groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

再运行,校验成功:

在这里插入图片描述

JSR303的校验,用处很多,比如写接口时,对前端的传参做校验,只需要在Dto类中的属性加相关注解即可,如:

在这里插入图片描述

添加校验规则:

在这里插入图片描述

7、yaml绑定值的坑–关于进制

在yaml中定义一个属性password,取值0127,使用属性绑定或者@Value取值,打印这个值:

在这里插入图片描述
在这里插入图片描述
问题的原因就是,在yaml中,书写数字和简单字符串都不用加引号,而0127又特殊在以0开头,后面的字符在0-7之间,被当作了八进制,可通过加引号解决:

datasource:
  password: "0127"

在这里插入图片描述
即:注意yaml文件中对于数字的定义支持进制书写格式,如需使用字符串请使用引号明确标注

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

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

相关文章

gateway之过滤器(Filter)详解

文章目录 什么是过滤器过滤器的种类局部过滤器代码示例全局过滤器代码示例 总结 什么是过滤器 在Spring Cloud中&#xff0c;过滤器&#xff08;Filter&#xff09;是一种关键的组件&#xff0c;用于在微服务架构中处理和转换传入请求以及传出响应。过滤器位于服务网关或代理中…

CRM客户管理系统主要用途

对于大多数企业而言业绩就是生命线&#xff0c;因此销售环节在企业管理过程中意义重大。面对愈发内卷的市场竞争企业就要借助CRM销售管理系统改善各个环节存在的漏洞&#xff0c;占据优势。那么&#xff0c;销售管理系统的用途有哪些&#xff0c;接下来我们从下面3个功能来介绍…

ESP32-IDF使用I2S驱动MAX98375--解析WAV文件

一. 简介 本篇文章将介绍如何使用ESP32S3通过I2S发送WAV音频数据&#xff0c;驱动MAX98375A进行音频的播放。是EVE_V2项目开发的一部分工作。 二. MAX98375A介绍 芯片特性如下&#xff0c;可以在芯片手册上找到。 单电源工作(2.5V至5.5V)3.2W输出功率&#xff1a;4Ω&#…

anaconda安装完成之后输入conda -V没有反应

anaconda安装完成后&#xff0c;conda没有反应 vim ~/.bashrc后面添加内容 # added by Anaconda3 5.3.0 installer # >>> conda init >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(CONDA_REPORT_ERRORSfalse /u…

springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录 环境&#xff1a; 1.驼峰转下划线配置 1.1单个字段命名转化使用JsonProperty注解 1.2单个类进行命名转化使用JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)注解 3.全局命名策略配置 2. 序列化以及反序列化 2.1序列化 2.2反序列化 3.自定义序列…

ImageJ查看图像灰度值矩阵及像素编号从0开始

ImageJ查看图像灰度值矩阵 imagej打开一幅图像 然后image —— transform——image to results&#xff0c;等一下就会出现灰度值矩阵 我读取的如下&#xff0c;可以看出&#xff0c;imagej对像素的编号是从0开始的&#xff0c;切记&#xff01;&#xff01;&#xff01;跟C/…

【论文笔记】Scene as Occupancy

原文链接&#xff1a;https://arxiv.org/abs/2306.02851 1. 引言 与传统的3D框物体表达相比&#xff0c;使用3D占用表达是几何感知的&#xff0c;因为3D框表达简化了物体的形状。此外&#xff0c;现有基于视觉的方法很少考虑时间信息&#xff1b;单阶段方法缺少从粗到细的细化…

Linux 线程(thread)

进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能&#xff1a;创建一个子线程&#xff0c;一般情况下main函数所在的线程称为主线程&#xff0c;…

科技资讯|Canalys发布全球可穿戴腕带设备报告,智能可穿戴增长将持续

市场调查机构 Canalys 近日发布报告&#xff0c;表示 2023 年第 2 季度全球可穿戴腕带设备出货量达 4400 万台&#xff0c;同比增长了 6%。 主要归功于其亲民的价格以及消费者对价位较高的替代品仍持谨慎态度&#xff0c;基础手环市场尽管与去年同期相比有所下降&#xff0c;…

JDBC连接mysql

文章目录 JDBC简介JDBC-MYSQL驱动下载JDBC使用通过结果集查询 PreparedStatement 预处理查询事务批处理连接池1.C3P02.德鲁伊 druid DBUtils工具 JDBC简介 JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI&#xff0c;可以为多种关系数据库提供统…

极简式看图软件 Pixea Plus for Mac

Pixea Plus for Mac介绍 简单易用&#xff1a;Pixea的用户界面非常简洁直观&#xff0c;容易上手。 图片管理&#xff1a;Pixea允许用户创建个人或业务相册&#xff0c;并提供了图片搜索、排序、过滤等多种管理功能&#xff0c;方便用户组织和查找照片。 图片编辑&#xff1…

【Java 基础篇】Java网络编程:文件下载详解

文件下载是网络应用程序中的一个常见任务&#xff0c;允许用户从远程服务器获取文件。Java提供了丰富的网络编程库&#xff0c;使文件下载变得相对简单。本文将详细介绍如何使用Java进行文件下载&#xff0c;并提供一些相关内容的解释。 什么是文件下载 文件下载是指从一个网…

Django之初入门

一&#xff09;Django简介 1.简介 Django是一个开源的Python Web框架&#xff0c;它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC&#xff08;Model-View-Controller&#xff09;的架构模式&#xff0c;通过强大的工具和功能&#xff0c;提供了一套完整…

最新版本 在线生成SSL证书源码 后台对接ssl证书api接口

SSL证书是保证网络安全的基本保障之一。向您介绍我们的在线生成SSL证书系统&#xff0c; 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;后台对接ssl证书api接口。

金融行业如何利用软文营销进行品牌维护

金融行业作为强监管行业&#xff0c;与人民财产息息相关&#xff0c;因此塑造可靠的品牌形象是金融行业必须面对的课题&#xff0c;而金融行业的特性决定了它在品牌传播与建设上会受到一定的限制&#xff0c;因此金融行业想要进行品牌维护的话&#xff0c;软文营销就是非常不错…

频频刷屏朋友圈,白酒如何越来越年轻化?来聊聊白酒企业数字化

最近&#xff0c;某白酒品牌频频吸引大众眼球&#xff0c;白酒与咖啡、巧克力等联名衍生品一经推出便掀起热潮。某商品由于太过火爆&#xff0c;甚至一度售罄下架。 不得不说&#xff0c;我国拥有超大规模内需市场&#xff0c;消费潜力巨大。 当前&#xff0c;创新消费场景加…

vue 路由中 vite 与webpack 动态 导入的方法汇总

vite 动态导入路由&#xff1a; router/index.js文件 //vite 下面寻找 views 文件夹下面所有的page.js文件 let pageList import.meta.glob(../views/**/page.json, {eager: true,import: default, }); //所有的文件 const modules import.meta.glob(../views/**/**.vue);/…

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选 适用性较广的基础多选&#xff0c;用 Tag 展示已选项 <template><el-select v-model"value1" multiple placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.la…

linux下特定usb设备的权限设置

文章目录 背景查找资料解决方案 背景 目前我在Ubuntu下使用一个USB热成像摄像头&#xff0c;通过调用它的sdk进行图像的采集以及获取对应像素点的温度。假设我现在的测试程序名称为MyApp。 当我用下面的命令运行时&#xff0c;程序是正常运行且能从热成像仪采集图像 sudo ./M…

上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案

自米尔国产全志T113系列的核心板发布以来&#xff0c;这款高性价比、低成本、入门级、高性能的国产核心板咨询不断&#xff0c;配套的开发板已经成交量数百套&#xff0c;深受工程师们的青睐&#xff0c;为了集齐T113全系列的产品&#xff0c;这次米尔发布了基于全志T113-i处理…