【Spring Boot】6.Yaml语法

1.简介

YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据做为中心,而不是以标记语言为重点!

2.对比

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties
    • 语法结构 : key=value
server.port=8081
  • application.yaml
    • 语法结构 : key:空格 value
 server:
 	  prot: 8080
键值对
name: zhang

对象(子集开头必须要空格)
student:
	name: zhang
	age: 21
	
行内写法
student: {name: zhang,age: 21}


数组
pets:
  - cat
  - dog

pets: [cat,dog]

3.注入配置文件

这是yaml文件强大的地方!之后笔记会提到

4.测试

4.1 创建SpringBoot项目

在这里插入图片描述

4.2 导入Pom

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
</dependency>
//在yamal中,自定义类没有提示。则需要一下导入
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
</dependency>

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

4.3 编写实体类

4.3.1 Person

package com.node.demo.bean;

import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

@ConfigurationProperties(prefix = "person")
@Component
@Data
@ToString
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> score;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;
}

4.3.2 Pet

package com.node.demo.bean;

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Pet {
    private String name;
    private Double weight;
}

4.4 编写application.yaml

person:
  userName: zhangsan
  #userName: 'zhangsan \n 李四':单引号会将\n作为字符串输出,单引号改变了转义字符(转转变不转)
  #userName: "zhangsan \n 李四":双引号会将\n作为换行输出
  boss: false
  birth: 2019/12/12 20:12:33
  age: 18
  pet:
    name: tomcat
    weight: 23.4
  interests: [篮球,游泳]
  #interests:
  #  - 篮球
  #  - 足球
  #  - 18
  animal:
    - jerry
    - mario
  score:
    english:
      first: 30
      second: 40
      third: 50
    math: [131,140,148]
    chinese: {first: 128,second: 136}
  salarys: [3999,4999.98,5999.99]
  allPets:
    #sick: 生病的宠物
    sick:
      - {name: tom}
      - {name: jerry,weight: 47}
    #health: 健康的宠物
    health: [{name: mario,weight: 47}]

4.5 编写Controller

package com.node.demo.controller;

import com.node.demo.bean.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    Person person;

    @RequestMapping("/person")
    public Person person(){
        return person;
    }
}

4.6 测试结果

在这里插入图片描述

09:17:21.728 [main] ERROR org.springframework.boot.SpringApplication -- Application run failed org.yaml.snakeyaml.scanner.ScannerException: while scanning a double-quoted scalar in 'reader', line 96, column 18: avatar-path: "C:\Users\35182\Desktop\workspac ... ^ expected escape sequence of 8 hexadecimal numbers, but found: sers\351 in 'reader', line 96, column 23: avatar-path: "C:\Users\35182\Desktop\workspace-and ... ^ at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalarNonSpaces(ScannerImpl.java:1938) at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalar(ScannerImpl.java:1882) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchFlowScalar(ScannerImpl.java:1057) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDouble(ScannerImpl.java:1039) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:427) at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:238) at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:669) at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161) at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57) at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43) at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:136) at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:116) at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:249) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:214) at org.yaml.snakeyaml.composer.Composer.composeKeyNode(Composer.java:386) at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:357) at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:329) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:218) at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:396) at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:361) at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:329) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:218) at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:396) at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:361) at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:329) at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:218) at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:141) at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:162) at org.springframework.boot.env.OriginTrackedYamlLoader$OriginTrackingConstructor.getData(OriginTrackedYamlLoader.java:99) at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:529) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:203) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:169) at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:84) at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54) at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36) at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:96) at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132) at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87) at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:121) at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:245) at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:232) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:96) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:89) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:132) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:115) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:81) at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:64) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:63) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:353) at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) at com.mix.YSKAHApplication.main(YSKAHApplication.java:21)
最新发布
08-06
<think>我们正在处理一个Spring Boot应用启动时遇到的YAML解析错误。错误信息是:"expected escape sequence in double-quoted scalar at line 96, column 18"。这意味着在YAML配置文件的第96行第18列,一个双引号内的字符串中,解析器期望一个转义序列但没有找到。 根据错误信息,问题出现在双引号字符串中。在YAML中,双引号字符串允许使用转义序列(例如`\"`表示双引号,`\\`表示反斜杠,`\n`表示换行等)。如果在一个双引号字符串中出现了反斜杠`\`,那么它必须后跟一个有效的转义字符。否则,解析器就会报错。 因此,我们需要检查配置文件(通常是`application.yml`或`application.yaml`)的第96行附近的内容,特别是第96行第18列的位置。 解决步骤: 1. 打开配置文件,定位到第96行,第18列附近。 2. 检查该位置是否在双引号字符串内,并且是否包含了一个没有完成转义的字符(比如一个单独的`\`,而不是`\\`或其他有效的转义序列)。 3. 修正这个转义序列。 例如,假设第96行内容如下: ```yaml message: "This is a string with an unescaped backslash: \ " ``` 这里,反斜杠后面跟着一个空格,这不是一个有效的转义序列。应该将反斜杠转义为`\\`,或者如果不需要反斜杠则删除它。修正后: ```yaml message: "This is a string with an escaped backslash: \\ " ``` 或者,如果这个反斜杠是路径分隔符,在Windows路径中常见,但YAML中需要正确转义: 错误示例: ```yaml path: "C:\Users\name" ``` 正确法应该是: ```yaml path: "C:\\Users\\name" ``` 或者使用单引号避免转义(但单引号内不会处理转义序列,所以反斜杠就是字面意义): ```yaml path: 'C:\Users\name' ``` 另外,还要注意双引号字符串中的其他特殊字符,如双引号本身`"`需要用`\"`表示。 如果问题仍然存在,请检查配置文件是否有其他语法错误,例如缩进不一致、冒号后面没有空格等。 根据引用[1]中的错误(虽然它是关于YAML转JSON的错误,但根本原因也是YAML语法错误),我们可以知道YAML语法要求严格。 同时,引用[2]提到安装yaml包的问题,但这里我们不需要安装额外的包,因为Spring Boot已经内置了SnakeYAML库来解析YAML。 因此,解决方案就是检查并修正YAML配置文件中的转义字符。 如果用户无法直接定位到错误,可以使用在线的YAML验证工具(例如https://yaml-online-parser.appspot.com/)来帮助检查。 注意:有时行号可能因为编辑器设置(如换行符、制表符等)而略有偏差,所以检查附近几行也是必要的。 相关问题: 1. 如何在Spring Boot中正确使用YAML配置文件? 2. YAML配置文件中的转义规则是什么? 3. 如何避免YAML配置文件中的常见语法错误? 4. Spring Boot支持哪些配置文件格式?它们之间有什么区别? 5. 如何验证YAML文件的语法是否正确?</think>### Spring Boot YAML 配置文件解析错误解决方案 当 Spring Boot 应用启动时遇到 `expected escape sequence in double-quoted scalar at line 96, column 18` 错误,这表示在 YAML 配置文件的第 96 行第 18 列位置存在转义序列问题。以下是详细解决步骤: #### 问题原因分析 1. **双引号字符串中的转义错误** 在 YAML 中,双引号字符串(`"..."`)内的反斜杠 `\` 必须构成有效的转义序列(如 `\n`, `\"`, `\\` 等) 2. **常见错误场景**: - Windows 路径未正确转义:`path: "C:\Users\name"`(应为 `"C:\\Users\\name"`) - 正则表达式未转义:`pattern: "\d{3}"`(应为 `"\\d{3}"`) - 特殊字符未处理:`message: "Hello "World""`(应为 `"Hello \"World\""`) #### 解决步骤 1. **定位错误位置** 打开 `application.yml` 文件,跳转到第 96 行第 18 列附近: ```yaml # 示例错误位置(第96行) error-path: "C:\Users\project\data" # ← 此处反斜杠需要转义 ``` 2. **修正转义序列** 对反斜杠 `\` 进行双重转义: ```yaml # 修正后(使用双反斜杠) correct-path: "C:\\Users\\project\\data" ``` 3. **替代解决方案** - 方案1:改用单引号(避免转义) ```yaml safe-path: 'C:\Users\project\data' # 单引号内不解析转义 ``` - 方案2:使用 YAML 块标量(`|` 或 `>`) ```yaml multiline-text: | This is a multi-line string with \backslashes\ and :colons: # 无需转义 ``` 4. **验证配置文件** 使用在线 YAML 校验工具(如 [yamlvalidator.com](https://yamlvalidator.com))检查语法: ```yaml # 验证示例 key: "Valid \\ escape" # ✓ 正确 # key: "Invalid \ escape" # ✗ 会报错 ``` #### 预防措施 1. **IDE 辅助** 安装 IntelliJ IDEA 的 [YAML/Ansible 插件](https://plugins.jetbrains.com/plugin/7791-yaml-ansible-support),实时检测转义错误: ![YAML 错误提示](https://example.com/yaml-lint.png) [^1] 2. **Spring Boot 配置提示** 在 `pom.xml` 中添加配置处理器,获取自动补全和验证: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> ``` > **关键提示**:YAML 解析错误通常由 3 类问题引起:① 未转义的反斜杠(占 75%+)② 未闭合的引号 ③ 缩进不一致。优先检查路径和正则表达式中的反斜杠[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值