Spring Boot常用注解@ConfigurationProperties松散绑定数据校验

Posted Binaire-沐辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot常用注解@ConfigurationProperties松散绑定数据校验相关的知识,希望对你有一定的参考价值。

目录

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


访问http://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等等,可以根据实际情况选择合适的注解。

03-Spring Boot常用注解解读

Spring Boot深度课程系列

03 Spring Boot常用注解解读

Spring Boot中使用了大量的注解,我们下面对一些常用的注解进行一些介绍,方便大家在使用的过程中能够理解。

 

 

详细说明:

1)@SpringBootConfiguration:表明这是一个配置类,相等于ApplicationContext.xml.我们在Spring框架中一般在该文件中进行Bean的创建。当使用该注解后,我们可以在该类中通过@Bean注解创建Bean.

2)EnableAutoConfiguration:表明开启自动化配置。它是非侵入式的,开发者可以在任何使用用自定义的配置覆盖自动化配置中的某一个配置。

3)ComponentScan:用于完成包的扫描,它默认扫描的类都放在该类所在的包的下面,因此建议所有的包和类都放在该类的包的下面进行创建。

 

以上是关于Spring Boot常用注解@ConfigurationProperties松散绑定数据校验的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中常用的三个注解

Spring Boot常用注解

spring boot常用注解

Spring Boot常用注解总结

spring boot之入门Controller常用注解

Spring Boot常用注解和原理整理