yaml 的语法其实很容易懂的, 但是对于新手而言, 难以一下子接受, 特别是其中的列表/对象语法, 当然, 更难的是列表嵌套对象语法. 不过呢, 习惯了就会发现, 哦, 还好吧.
问题现象
今天呢, 又遇到一个yaml的配置问题, 但是, 这个问题很奇怪, 一下子发现不了原因啊. 报错误日志如下:
rocketmq:
name-server: 1214:9876
producer:
access-key: 4f494c12-dfdd-49ec-9c23-121212222222
secret-key: 28b8701c-caa4-47c4-b6df-17830d6e71c8
#必须指定group
#生产者组名,规定在一个应用里面必须唯一
group: wallet-group
#消息发送的超时时间 默认3000ms
send-message-timeout: 3000
#消息达到4096字节的时候,消息就会被压缩。默认 4096
compress-message-body-threshold: 4096
#最大的消息限制,默认为128K
max-message-size: 4194304
#同步消息发送失败重试次数
retry-times-when-send-failed: 3
#在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
retry-next-server: true
#异步消息发送失败重试的次数
retry-times-when-send-async-failed: 3
consumer:
access-key: 4f494c12-dfdd-49ec-9c23-2c84b0a9de3brfBd56
secret-key: 28b8701c-caa4-47c4-b6df-17830d6e71c8
org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
in 'reader', line 136, column 1:
^
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:421)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:226)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:557)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:157)
...
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
问题分析
左思右想也想不明白, 我的yaml文件里面并没有 reader 字样, 怎么会提示 in 'reader', line 136, column 1: 呢? 难道是 136行?
用idea 打开文件, 仍然没有头绪.. 日志提示是 found character '\t(TAB)' , 也就是遇到了一个跳格tab, 难道是tab 键引起的? 我使用 notepad++ 打开了那个配置文件, 果然发现了异常:
原来是yaml 不支持tab 键引入的空格! 问题解决, 下次记得老老实实的使用 space 空格吧 !!!