当前位置: 首页 > article >正文

(3)yaml语法

yaml语法

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

通俗的来说yaml也是一种配置文件,与之前的properties文件用处是一样的;

YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

YAML 的配置文件后缀为 .yml,如:runoob.yml

基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

对比一下我们最开始写的配置文件.xml文件

<sever>
	<port>8080</port>
</sever>

现在我们的.yaml文件是这样的。

server:
  port: 8080

数据类型

YAML 支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

我们可以发现他有一个与传统的.properties文件不一样的特点,它可以保存对象

#yaml键值对
name: kangKing
#yaml创建对象
student: 
  name: Kangking
  age: 18
#行内写法
student: {name: KangKing,age=18}
#properties键值对
name=KangKing
#properties创建对象
student.name=KangKing
student.age=18;

yaml数组:

#数组
pet: 
  - cat
  - dog
  - pig
    
pet: [cat,dog,pig]

最重要的功能其实是它可以直接给实体类赋值

回顾一下我们在Spring中学习的注解

传统赋值

package com.kang.start.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Pet {
    @Value("Dog")
    String name;
    @Value("3")
    Integer age;

    @Override
    public String toString() {
        return "Pet{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Pet() {
    }

    public Pet(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
  1. 这里使用@Component把它注入到容器
  2. @Value(“默认值”)//给对象赋默认值

在单元测试中试验一下

@SpringBootTest
class StartApplicationTests {
    @Autowired
    private Pet pet;
    @Test
    void contextLoads() {
        System.out.println(pet);
    }
}

image-20250131232746083

yaml注入

首先创建一个Person类

import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private  Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Pet pet;

由于get和set方法等会占用大量的篇幅,先省略了;

@ConfigurationProperties(prefix = “person”)这个注解是注入默认配置的重点,它可以帮我们绑定配置文件(properties或者yaml)文件中,指定的值;

person:
  name: 康王
  age: 20
  happy: true
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    -one
    -two
    -three
  pet:
    name: dog01
    age: 2

其中绑定的就是第一行的person,注意:

@ConfigurationProperties(prefix = “前缀”)//前缀中一定不能有大写字母。

image-20250131235352964

成功输出。

SpringBoot Configuration Annotation Processor Not Configured

在我们使用@ConfigurationProperties(prefix = “前缀”)注解的时候会报错显示

image-20250201152820435

我们需要导入两个依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

再打开

image-20250201152748544

重启Idea就解决了,在开发过程中有时候配置文件会乱码,建议做如下配置,编码格式都指定为UTF-8;

image-20250201153527172

其中也有一些类似于STL表达式的用法

person:
  name: ${person.pet.name:狗主人}的主人
  age: ${random.int}
  happy: true
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    -one
    -two
    -three
  pet:
    name: dog1
    age: 2

${random.int}是随机生成int类型的数。

image-20250201162303684

当我们把person.pet.name置为空时

image-20250201162420036

${person.pet.name:狗主人}的主人这个表达式会检测是否为空,为空时输出默认值。

JSR303(@Validated)

作用:校验码输入的数据是否合法。

用法:

导入依赖

<!--引入validation的场景启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

添加注解@Validated

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    @NotNull(message = "不能为空")
    private String name;
    private  Integer age;

下面是常用的校验注解和报错(message)

Bean Validation 中内置的 constraint

Constraint 详细信息
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Futuret 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
分类:Hibernate Validator 附加的 constraint

Constraint 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内

原文链接:https://blog.csdn.net/xueguchen/article/details/111406671

效果:

image-20250201190836737


http://www.kler.cn/a/535112.html

相关文章:

  • B站自研的第二代视频连麦系统(上)
  • IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案
  • GNN多任务预测模型实现(二):将EXCEL数据转换为图数据
  • Kafka 可靠性探究—副本刨析
  • 【NR-NTN】3GPP Release 18中NR-NTN过程描述
  • TensorFlow是个啥玩意?
  • 无人机测绘技术,为行业开启解决方案新篇章!
  • 4.攻防世界 unseping
  • 设计模式Python版 享元模式
  • 【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命
  • GC日志的解读
  • Ubuntu 上可以安装ms sqlserver?(不能上网)
  • Flutter初相识
  • 来 Gitcode 免费体验 DeepSeek 蒸馏模型,开启 AI 探索新旅程
  • day33-数据同步rsync
  • deepseek来讲lua
  • 【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
  • 2月7号习题
  • Matlab个性化绘图第8期—进度柱状图
  • LeetCode 每日一题 2025/1/27-2025/2/2
  • HOW - 个人创业(准备篇)
  • Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)
  • 【ABB阀门定位器EDP300如何进行自整定】
  • 解决使用python提取word文档中所有的图片时图片丢失的问题
  • MMU工作原理
  • linux的基础入门2