spring boot读取yml配置注意点记录

问题1:yml中配置的值加载到代码后值变了。

现场yml配置如下:

java 复制代码
type-maps:
  infos:
    data_register: 0
    ns_xzdy: 010000
    ns_zldy: 020000
    ns_yl: 030000
    ns_jzjz: 040000
    ns_ggglyggfwjz: 050000
    ns_syffyjz: 060000
    ns_gyjz: 070000
    ns_ccywljz: 080000
    ns_qtjz: 090000

服务会根据拿到的分类代码查找对应的分类名称。项目组反馈前端传080000可以拿到分类名称,但是前端传060000的时候却拿不到值,很是奇怪。使用线上诊断神奇arthas看了一眼,大吃一惊:

这配置加载的不对劲。

一通查找发现是因为YML规范的问题:

在Spring Boot应用中,当你尝试从application.yml文件中读取一个值,并且该值是一个以01开头的数字,可能会遇到问题。YAML 1.2 规范允许以0开头的数字被解析为八进制(Octal),但是如果数字包含89,则会导致解析错误,因为八进制数系统不包含这些数字。

这也就解释了为什么080000可以,060000不可以。 因为00-07开头的都会被以8进制的方式解析,这就是上午4096等数字的由来。

解决办法:

  1. 如果你需要保持该数字为八进制,确保其余部分只包含07的数字。

  2. 如果你需要保留这个值作为字符串,可以在YAML配置中使用双引号将值包裹起来,这样Spring Boot会将其当作字符串处理,不会尝试转换为数字。 例如:



问题2:spring boot服务通过nginx代理后获取不到准确的IP。

现场服务要求使用加密传输,于是使用nginx代理成https转发给后台。结果后台通过

复制代码
request.getRequestURL()

拿到的请求还是http的,导致业务处理有问题。

又是一通查找发现首先nginx要配置转发请求协议

proxy_set_header X-Forwarded-Proto $scheme;

完整的nginx配置如下:

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-Port $server_port;

然后在后台服务的yml添加配置:

复制代码
server:
  forward-headers-strategy: native # 自动处理请求转发问题

即可自动获取到前端发起的请求地址。



等待下次更新。。。。。。

相关推荐
scott.cgi34 分钟前
Unity直接编译Java文件作为插件,导致失败的两个打包设置
java·unity·unity调用java·unity的java文件·unity的android插件·unity调用android·unity加载java代码
KaMeidebaby3 小时前
卡梅德生物技术快报|骆驼纳米抗体:从原核表达、高通量测序到分子对接全流程实现
前端·数据库·其他·百度·新浪微博
澈2074 小时前
C++并查集:高效解决连通性问题
java·c++·算法
2401_873479406 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889996 小时前
大事件板块一
java
摇滚侠6 小时前
@Autowired 和 @Resource 的区别
java·开发语言
2301_783848656 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
SeaTunnel6 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
TE-茶叶蛋7 小时前
DBeaver 的Explain 执行计划,分析sql的性能
数据库·sql
Ting-yu7 小时前
SpringCloud快速入门(7)---- 数据隔离
spring boot·spring·spring cloud