关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

作者:Java笔记虾 时间:2023-11-03 15:37:41 

@ConfigurationProperties

源码分析

@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,通过如下源码可以看出, 如果你想绑定和验证一些外部属性,可以将它添加到类定义或@Configuration类中的@Bean方法上。

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

标注在类上

@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;
   }
}

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

标注在方法上

上面源码中说到可以将它添加到@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,查看控制台输出!!!

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

松散绑定

我们在使用 @ConfigurationProperties注解的时候,@ConfigurationProperties(prefix = &ldquo;userinfo&rdquo;),这里给prefix的属性值与yml文件中的属性名称不一致,但是依旧绑定成功了!原因是什么呢?

这就需要提到Spring的松散绑定属性规则。因此使用以下方式书写都能与类的属性名称匹配。

userInfo:
 userId: 1001 # 驼峰命名方式
 #user_id: 1002 #下划线方式
 #user-id: 1003 #烤肉串方式
 #USER_ID: 1004 # 常量方式
 name: lucycd

需要注意的是,prefix的属性值必须全部为小写,就像下图所示,就会报错:前缀必须是规范形式。

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

运行程序,也会在控制台提示你:配置属性名称&ldquo;userInfo&rdquo;无效;无效字符:&ldquo;I&rdquo;

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

数据校验

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;
   }
}

运行程序,查看控制台,校验成功!!!

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

同样,将数据修改为符合规则的数据,程序就可以成功运行了!!!

当然,这里的校验规则还有许多,@NotNull@NotEmpty@Email等等,可以根据实际情况选择合适的注解。

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

来源:https://javazhiyin.blog.csdn.net/article/details/128928271

标签:@ConfigurationProperties,松散绑定,数据校验
0
投稿

猜你喜欢

  • Android实战教程第八篇之短信备份

    2021-07-17 23:31:43
  • SpringBoot2 实现JPA分页和排序分页的案例

    2022-02-23 13:26:08
  • SpringBoot 配置文件加密的步骤

    2023-10-23 02:55:55
  • C语言中求字符串长度的函数的几种实现方法

    2023-07-04 23:29:05
  • 细品Java8中hashCode方法的使用

    2023-10-04 14:01:19
  • JAVA实现PDF转HTML文档的示例代码

    2021-10-18 12:47:00
  • android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多

    2023-05-23 05:29:16
  • C# DataGridView添加新行的2个方法

    2023-06-23 05:42:19
  • C#实现类似新浪微博长URL转短地址的方法

    2023-06-02 12:59:28
  • C#难点逐个击破(3):params数组参数

    2022-01-17 14:40:22
  • 例题详解Java dfs与记忆化搜索和分治递归算法的使用

    2022-03-15 08:29:55
  • Android自定义wheelview随机选号效果

    2021-09-12 06:36:53
  • spring @Conditional的使用与扩展源码分析

    2022-01-09 05:52:57
  • C#快速排序算法实例分析

    2023-06-17 00:30:00
  • spring data jpa分页查询示例代码

    2023-01-09 14:51:50
  • Kotlin 接口与 Java8 新特性接口详解

    2023-09-10 01:10:45
  • C#下载歌词文件的同步和异步方法

    2023-04-11 22:46:49
  • 详解ArrayList的扩容机制

    2022-06-18 05:56:32
  • 详解java基础--提示对话框的使用

    2023-01-31 12:11:46
  • c#使用Socket发送HTTP/HTTPS请求的实现代码

    2023-10-12 07:10:00
  • asp之家 软件编程 m.aspxhome.com