关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验
作者:Java笔记虾 发布时间:2023-11-03 15:37:41
@ConfigurationProperties
源码分析
@ConfigurationProperties
主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,通过如下源码可以看出, 如果你想绑定和验证一些外部属性,可以将它添加到类定义或@Configuration
类中的@Bean
方法上。
标注在类上
@Data //使用该注解需要导入Lombok依赖
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {
private String userId;
private String name;
}
application.yml文件配置内容
userInfo:
userId: 1001
name: lucy
接下来通过控制器方法来返回这个对象,查看数据是否绑定
@RestController
public class HelloController {
@Autowired
private UserInfo userInfo;
@GetMapping("/user")
public UserInfo getUserInfo(){
return userInfo;
}
}
标注在方法上
上面源码中说到可以将它添加到@Configuration
类中的@Bean
方法上,所以下面来看看标注在方法上是如何使用的!
比如我们用到druid数据源的操作,这个数据源是属于第三方的,所以我们不能操作源码,不能再源码里面找到它的对象来给他添加注解,但我们可以在yml文件中给他配置,来拿到它的属性。
首先添加所需的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
接着在yml文件中配置数据源
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: root
创建一个配置类,然后在类方法上添加注解,并通过prefix绑定数据
@SpringBootConfiguration
public class DatasourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.database.druid")
public DataSource database(){
return new DruidDataSource();
}
}
通过控制器方法来检验绑定效果
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@GetMapping("/datasource")
public void getDataSource(){
System.out.println(dataSource);
}
}
访问//localhost/datasource
,查看控制台输出!!!
松散绑定
我们在使用 @ConfigurationProperties
注解的时候,@ConfigurationProperties(prefix = “userinfo”)
,这里给prefix的属性值与yml文件中的属性名称不一致,但是依旧绑定成功了!原因是什么呢?
这就需要提到Spring的松散绑定属性规则。因此使用以下方式书写都能与类的属性名称匹配。
userInfo:
userId: 1001 # 驼峰命名方式
#user_id: 1002 #下划线方式
#user-id: 1003 #烤肉串方式
#USER_ID: 1004 # 常量方式
name: lucycd
需要注意的是,prefix的属性值必须全部为小写,就像下图所示,就会报错:前缀必须是规范形式。
运行程序,也会在控制台提示你:配置属性名称“userInfo
”无效;无效字符:“I”
数据校验
Spring Boot中有很多配置文件,配置文件中我们可以自定义一些对应的属性值。那么这些属性值是否合法呢?我们如何来校验?在Java中有一种JSR303规范,我们可以针对一些对应的数值来进行校验。按照规范来进行书写,如果不符合要求就说明校验失败,反之,则成功!
SpringBoot也给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVA EE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。
导入验证包和校验实现包
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
添加注解@Validated
给属性添加验证规则
@Data
@Component
@ConfigurationProperties(prefix = "userinfo")
@Validated
public class UserInfo {
@Max(value = 1000,message = "userid超出范围了!")
@Min(value = 0,message = "userid不能小于0!")
private String userId;
@Size(min = 2,max = 5,message = "name长度应该在2-5之间")
private String name;
}
这里我们先输入不符合规范的数据,来验证数据是否能够校验成功
userInfo:
userId: 1001
name: lucycd
编写一个控制器方法来检验
@RestController
public class HelloController {
@Autowired
private UserInfo userInfo;
@GetMapping("/user")
public UserInfo getUserInfo(){
return userInfo;
}
}
运行程序,查看控制台,校验成功!!!
同样,将数据修改为符合规则的数据,程序就可以成功运行了!!!
当然,这里的校验规则还有许多,@NotNull
、@NotEmpty
、@Email
等等,可以根据实际情况选择合适的注解。
来源:https://javazhiyin.blog.csdn.net/article/details/128928271


猜你喜欢
- 一、简述首先,Java 8引入了java.time.LocalDate来表示一个没有时间的日期。其次,使用Java 8版本,还需要更新jav
- 绑定多个按钮到同一个事件1.添加代码private void clauseElementClicked(object sender, Eve
- 本文实例讲述了Spring实战之SpEl语法。分享给大家供大家参考,具体如下:一 Beanpackage org.crazyit.app.d
- 开篇点题:正则表达式方法效果=0(下面会提到效果)空行问题: VS:在使用过程中对于VS的自动整理不太满意,因为不会自动删除空行当出现这种情
- Flutter开发过程中,Drawer控件的使用频率也是比较高的,其实有过移动端开发经验的人来说,Flutter中的Drawer控件就相当于
- 有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下:using System;
- 一、项目简述本系统功能包括: 系统管理,招生计划,学生管理,录取结果,自动分配,调剂管理等等。二、项目运行环境配置:Jdk1.8 + Tom
- 现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思.这个辅助本身没什么难度,就
- 大家好,今天我们继续来学习Android 8.0系统的适配。之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应
- 引言ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设
- 本文实例为大家分享了Android创建发送和接收短信应用的简单实现过程,供大家参考,具体内容如下一、接收短信项目的结构如下:一个简单的接收和
- 本文实例为大家分享了C#简单爬虫案例,供大家参考,具体内容如下using System;using System.Collections.G
- 前言在我们的日常的编程当中,并发是始终离不开的主题,而在并发多线程当中,线程池又是一个不可规避的问题。多线程可以提高我们并发程序的效率,可以
- 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax 时,在后台将数据封装为 JSON 字符串更是常见。之前在做项目的时候
- springBoot使用事物比较简单,在Application启动类s上添加@EnableTransactionManagement注解,然
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:package wxapi.WxHelper; import java.io.Buffe
- 程序可分为三部分:头文件:包含结构声明和使用这些结构的函数的原型源代码文件:包含与结构有关的函数的代码源代码文件:包含调用与结构相关的函数代
- 本文实例讲述了Android编程实现实时监听EditText文本输入的方法。分享给大家供大家参考,具体如下:平时在做Android开发过程中
- API参数:/**fileName: 临时文件的名字, 生成后的文件名字将会是【fileName + 随机数】suffix: 文件后缀,例如
- 微信公众平台对信息做了比较清晰的分类,最基本的包括请求(Request)和响应(Response)两大类信息,这两类信息有分为文字、语音、图