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

文章目录

  • 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.hqwc.cn/news/115539.html

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

相关文章

链表的回文判断

思路: 找中间节点–>逆置->比较 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) { struct ListNode*slowhead; struct ListNode*f…

AI数字人:最强声音驱动面部表情模型VideoReTalking

目录 1 VideoReTalking论文解读 1.1 介绍 1.2 相关工作 1.2.1 视频编辑中的音频配音 1.2.2 基于音频的单图像面部动画 1.3 框架 1.3.1 语义引导重演网络 1.3.2 口型同步网络 1.3.3 身份感知增强网络 1.3.4 后期处理 1.4 训练 1.4.1 每个模块的训练 1.4.2 评估 1.…

8+单基因+细胞凋亡+WGCNA+单细胞+实验验证

今天给同学们分享一篇单基因细胞凋亡WGCNA实验验证的生信文章“RASGRP2 is a potential immune-related biomarker and regulates mitochondrial-dependent apoptosis in lung adenocarcinoma”&#xff0c;这篇文章于2023年2月3日发表在Front Immunol期刊上&#xff0c;影响因…

软件测试缺陷报告详解

【软件测试行业现状】2023年了你还敢学软件测试&#xff1f;未来已寄..测试人该何去何从&#xff1f;【自动化测试、测试开发、性能测试】 缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Pr…

【效率提升】maven 转 gradle 实战 | 京东云技术团队

一、灵魂三问 1、gradle 是什么&#xff1f; 一个打包工具&#xff0c; 是一个开源构建自动化工具&#xff0c;足够灵活&#xff0c;可以构建几乎任何类型的软件&#xff0c;高性能、可扩展、能洞察等。其中洞察&#xff0c;可以用于分析构建过程中数据&#xff0c;提供分析参…

一招解除csdn复制限制

先看这个代码 python读取英文pdf翻译成中文pdf文件导出代码 想要复制代码&#xff0c;csdn有限制怎么办&#xff08;csdn流氓&#xff0c;无耻&#xff09; 解除方法 ctrlu 看效果

UOS Deepin Linux 安装 anaconda

UOS Deepin Linux 安装 anaconda 下载 anaconda 官网下载 国内开源镜像站下载 官网下载 anaconda 官网&#xff1a; https://www.anaconda.com/ 点击右上角 Free Download 按钮 跳转值下载页面&#xff1a;https://www.anaconda.com/download 国内开源镜像站下载 清华大学开源…

TouchGFX之画布控件

TouchGFX的画布控件&#xff0c;在使用相对较小的存储空间的同时保持高性能&#xff0c;可提供平滑、抗锯齿效果良好的几何图形绘制。 TouchGFX 设计器中可用的画布控件&#xff1a; LineCircleShapeLine Progress圆形进度条 存储空间分配和使用​ 为了生成反锯齿效果良好的…

下载github.com上的依赖资源

下载github.com上的依赖资源&#xff08;需要反复试才能成功&#xff0c;所以单独安装&#xff09; export GIT_TRACE1 export GIT_CURL_VERBOSE1 pip install githttps://github.com/PanQiWei/AutoGPTQ.git -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-hostpypi.mi…

stm32之GPIO库函数点灯分析

stm32官方为了方便开发者&#xff0c;利用CubeMX 生成HAL库有关的C代码。HAL库就是硬件抽象层(hardware abstraction layer)&#xff0c;生成一系列的函数帮助我们快速生成工程&#xff0c;脱离复杂的寄存器配置。stm32相对于51来功能强大&#xff0c;但是寄存器的数量也不是一…

2023华为杯研究生数学建模C题分析

完整的分析查看文末名片获取&#xff01; 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性&#xff0c;不同专家评审的作品集合之间应有一些交集。但有的交集大了&#xff0c;则…

Openresty(二十二)ngx.balance和balance_by_lua终结篇

一 灰度发布铺垫 ① init_by_lua* init_by_lua init_by_lua_block 特点: 在openresty start、reload、restart时执行,属于master init 阶段机制&#xff1a; nginx master 主进程加载配置文件时&#xff0c;运行全局Lua VM级别上的参数指定的Lua代码场景&#xff1a; …