SpringBoot - yaml语法及JSR303校验

时间:2023-03-21
本文章向大家介绍SpringBoot - yaml语法及JSR303校验,主要内容包括yaml语法、yaml可以直接给实体类赋值、原来用Spring的方式、使用yaml赋值、使用properties文件赋值(个人感觉不如yaml配置好用)、松散绑定、JSR303数据校验、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

yaml语法

# key: value
# 对空格的要求十分高
# 普通的key-value:key=value

# 注入到我们的配置类中

name: qinjiang

# 对象(包含两个属性)
student:
  name: qinjiang
  age: 3

# 三个对象
student:
name: qinjiang
age: 3

# student对象下的name属性下的age属性
student:
  name: qinjiang
  	age: 3

# 行内写法:对象(包含两个属性)
student: {name: qinjiang,age: 3}

# 数组
pets:
  - cat
  - dog
  - pig
# 行内写法:数组
pets: [cat,dog,pig]

yaml可以直接给实体类赋值

原来用Spring的方式
  1. 创建实体类,使用@Value注解来赋值

    @Component
    public class Dog {
        @Value("旺财")
        private String name;
        @Value("3")
        private int age;
    
        public Dog() {
        }
    
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Dog{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
  2. 测试类

    @SpringBootTest
    class Springboot02ConfigApplicationTests {
    
        @Autowired
        private Dog dog;
    
        @Test
        void contextLoads() {
    
            System.out.println(dog);
    
        }
    
    }
    
使用yaml赋值
  1. 在resources文件夹中新建yaml配置文件

    person:
      name: qinjiang
      age: 3
      happy: false
      birth: 2023/3/21
      maps:
        k1: v1
        k2: v2
      lists: [sing,jump,rap]
      dog:
        name: 旺财
        age: 3
    
  2. 实体类

    @Component
    @ConfigurationProperties(prefix = "person") // 这里注意要与配置文件中的对象名一致
    public class Person {
        // 有参、无参构造器,Getter、Setter、toString方法
    }
    

这里使用的是实体类来举例,今后的配置类可以通过这种方法来进行赋值

使用properties文件赋值(个人感觉不如yaml配置好用)
  1. 在resources文件夹中新建properties配置文件

    name=kuangshen
    
  2. 配置实体类

    @Component
    @PropertySource(value = "classpath:qinjiang.properties") // 绑定配置文件名称
    public class Person {
    
        // SPEL表达式取出配置文件的值
        @Value("${name}")
        private String name;
        ...
    }
    
@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303 支持 不支持
复杂类型封装 支持 不支持
  • @ConfigurationProperties只需要写一次即可,@Value则需要每个字段都添加
  • 可以看到,yaml配置文件中的命名为first-name,实体类中的命名为firstName,-后面跟着的字母默认是大写的。这就是松散绑定。
  • JSR303校验,就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性
  • 复杂类型封装,yaml可以封装对象,使用@Value就不支持
松散绑定
  1. 配置yaml文件

    dog:
      first-name: 阿黄
      age: 3
    
  2. 配置实体类

    @Component
    @ConfigurationProperties(prefix = "dog")
    public class Dog {
    
        private String firstName;
        private int age;
        ...
    }
    

结论:

  • 配置yaml和配置properties都可以获取到值,强烈推荐yaml
  • 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@Value
  • 如果说,我们专门编写了一个JavaBean来喝配置文件进行映射,就直接使用@ConfigurationProperties,不要犹豫!

JSR303数据校验

  • JSR303校验,就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性
  1. pom文件导入依赖

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>2.7.9</version>
    </dependency>
    
  2. 配置实体类

    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated // 数据校验开启
    public class Person {
    
        @Email
        // @Eamil(message = "邮箱格式错误") 此处为设置提示消息,可自定义
        private String name;
        ...
    }
    
  3. 测试输出

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

Constraint 详细信息
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素须必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内

原文地址:https://www.cnblogs.com/jiaxing-java/p/17238584.html