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

文章目录

  • 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.1port: 9527timeout: 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.1port: 2345  timeout: -1
  • 下划线
servers:ip_address: 192.168.1.2port: 2345timeout: -1
  • 中划线(烤肉串写法,形似 00-0-0-0—,推荐写法)
servers:ip-address: 192.168.1.2port: 2345timeout: -1
  • 常量模式
servers:IP_ADDRESS: 192.168.1.2port: 2345timeout: -1
  • 随便加下划线或者中划线
servers:ip-ad-d_rEss: 192.168.1.2Port: 2345timeout: -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.1port: 2345  timeout: -1serverTimeOut: 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.rhkb.cn/news/139045.html

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

相关文章

【Python Fastapi】js上传文件,fastapi处理,js显示回传信息

python from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from typing import List import requestsapp FastAPI()# 配置静态文件目录 app.mount("/static"…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

YOLOv5、YOLOv8改进:Decoupled Head解耦头

目录 1.Decoupled Head介绍 2.Yolov5加入Decoupled_Detect 2.1 DecoupledHead加入common.py中&#xff1a; 2.2 Decoupled_Detect加入yolo.py中&#xff1a; 2.3修改yolov5s_decoupled.yaml 1.Decoupled Head介绍 Decoupled Head是一种图像分割任务中常用的网络结构&#…

MySQL进阶 —— 超详细操作演示!!!(中)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;中&#xff09; 三、SQL 优化3.1 插入数据3.2 主键优化3.3 order by 优化3.4 group by 优化3.5 limit 优化3.6 count 优化3.7 update 优化 四、视图/存储过程/触发器4.1 视图4.2 存储过程4.3 存…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式&#xff1f;3、为什么要开启 Hive 模式&#xff1f;4、有什么副作用&#xff1f;5、如何开启 Hive 兼容模式&#xff1f;6、该场景下&#xff0c;能不能不开启 Hive 兼容模式&#xff1f;7、为什么不是DATE_FORMAT(datetime, string)&…

【Qt-17】Qt调用matlab生成的dll库

matlab生成dll库 1、matlab示例代码 function BDCube(x,y)[x,y,z] cylinder(x,y);t1 hgtransform;s1 surf(3*x,3*y,4*z,Parent,t1);grid onview(3)shading interp end 2、matlab环境配置 首先检查自己的mcc编译器是否可用&#xff0c;输出以下命令&#xff1a; &#x…

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好&#xff0c;我是沙漠尽头的狼。 本方首发于Dotnet9&#xff0c;介绍使用dnSpy调试第三方.NET库源码&#xff0c;行文目录&#xff1a; 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具&#xff0c;…

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java中是一个常见的需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一系列的线程安全与并发问题。在本文中&#xff0c;我们将深入探讨这些问题&#xff0c;以及如何解决它们&#xff0c;适用于Java初学者和基础用户。 什么…

【AI视野·今日NLP 自然语言处理论文速览 第三十六期】Wed, 20 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 20 Sep 2023 Totally 64 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers SlimPajama-DC: Understanding Data Combinations for LLM Training Authors Zhiqiang Shen, Tianhua Tao, Li…

原生js值之数据类型详解

js的数据类型 数据类型分类基本数据类型boolean:布尔类undefined:未定义的值null类型数值转换 NumberparseInt 转换整数 parseFloat转换浮点数 String类型特点如何转换成字符串模板字面量字符串插值模板字面量标签函数 symbol类型特性使用 BigInt类型复杂数据类型Object类属性与…

[杂谈]-八进制数

八进制数 文章目录 八进制数1、概述2、八进制数的表示2.1 八进制数2.2 以八进制计数2.3 二进制数补零 3、八进制到十进制转换4、十进制到八进制转换5、二进制到八进制转换示例6、八进制到二进制和十进制转换示例7、总结 1、概述 八进制编号系统是另一种使用基数为8计数系统&am…

【Stm32】【Lin通信协议】Lin通信点亮灯实验

Lin通信点亮灯实验 通过STM32的串口发送数据&#xff0c;然后通过串口转换模块将数据转换成LIN&#xff08;Local Interconnect Network&#xff09;协议&#xff0c;最终控制点亮灯。需要工程和入门资料的可以私信我&#xff0c;看到了马上回。 入门书本推荐&#xff1a; 一…

【C++面向对象侯捷下】2.转换函数 | 3.non-explicit-one-argument ctor

文章目录 operator double() const {} 歧义了 标准库的转换函数

exe文件运行后无输出直接闪退如何找解决办法

一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息&#xff0c;直接用搜索引擎搜索这个异常代码能大致判断是什么问题&#xff0c;给了一个解决思路&#xff0c;不至于不知道到底哪里出了问题

AUTOSAR词典:CAN驱动Mailbox配置技术要点全解析

AUTOSAR词典&#xff1a;CAN驱动Mailbox配置技术要点全解析 前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; AUTOSAR框架下的CAN驱动关键词定义吗&#xff1f;是不是有些总是傻傻分不清楚呢&#xff1f;CAN驱动Mailbox配置过程中有哪些关键配置参…

Angular变更检测机制

前段时间遇到这样一个 bug&#xff0c;通过一个 click 事件跳转到一个新页面&#xff0c;新页面迟迟不加载&#xff1b; 经过多次测试发现&#xff0c;将鼠标移入某个 tab &#xff0c;页面就加载出来了。 举个例子&#xff0c;页面内容无法加载&#xff0c;但是将鼠标移入下图…

[面试] k8s面试题 2

文章目录 核心组件1.什么是 Kubernetes 中的控制器&#xff08;Controller&#xff09;&#xff1f;请提供一些常见的控制器类型。2.请解释一下 Kubernetes 中的 Ingress 是什么&#xff0c;以及它的作用。3.如何通过命令行在 Kubernetes 中创建一个 Pod&#xff1f;4.Stateful…

Pdf文件签名检查

如何检查pdf的签名 首先这里有一个已经签名的pdf文件&#xff0c;通过pdf软件可以看到文件的数字签名。 图1为签名后的文件&#xff0c;图2为签名后文件被篡改。 下面就是如何代码检查这里pdf文件的签名 1.引入依赖 <dependency><groupId>org.projectlombok<…

数据结构——单链表

目录 一.前言 二.链表表示和实现&#xff08;单链表&#xff09; 1.1 顺序表的优缺点 1.2 链表的概念及结构 1.3 打印函数 1.4 空间函数 1.5 尾插函数&#xff08;最最最麻烦的&#xff09; 1.5.1 尾插最关键部分&#xff01; 1.6 头插函数 1.7 尾删函数…

云流化:XR扩展现实应用发展的一个新方向!

扩展现实的发展已经改变了我们工作、生活和娱乐的方式&#xff0c;而且这才刚刚开始。扩展现实 (Extended reality, XR) 涵盖了沉浸式技术&#xff0c;包括虚拟现实、增强现实和混合现实。从游戏到虚拟制作再到产品设计&#xff0c;XR 使人们能够以前所未有的方式在计算机生成的…