Java Properties转YAML出现大量null项的原因及解决办法
Spring Gateway Properties转YAML出现大量null项问题解决
问题重现
我有部分Java Properties格式的Spring Gateway路由配置:
spring.cloud.gateway.routes[9].id = dict-auth spring.cloud.gateway.routes[9].order = 0 spring.cloud.gateway.routes[9].predicates[0] = Path=/dict/user/plugin/login spring.cloud.gateway.routes[9].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[10].filters[0] = RewritePath=/dict/auth/access_token/refresh, /post/auth/access_token/refresh spring.cloud.gateway.routes[10].id = dict-access-token-refresh spring.cloud.gateway.routes[10].order = 1 spring.cloud.gateway.routes[10].predicates[0] = Path=/dict/auth/access_token/refresh spring.cloud.gateway.routes[10].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[11].filters[0] = RewritePath=/dict/auth/refresh_token/refresh, /post/auth/refresh_token/refresh spring.cloud.gateway.routes[11].id = dict-refresh-token-refresh spring.cloud.gateway.routes[11].order = 2 spring.cloud.gateway.routes[11].predicates[0] = Path=/dict/auth/refresh_token/refresh spring.cloud.gateway.routes[11].uri = http://10.98.176.2:11014
转换成YAML后出现大量null项:
spring: cloud: gateway: routes: - null - null - null - null - null - null - null - null - null - id: dict-auth order: 0 predicates: - Path=/dict/user/plugin/login uri: http://10.98.176.2:11014 - null - filters: - RewritePath=/dict/auth/access_token/refresh, /post/auth/access_token/refresh id: dict-access-token-refresh order: 1 predicates: - Path=/dict/auth/access_token/refresh uri: http://10.98.176.2:11014 - filters: - RewritePath=/dict/auth/refresh_token/refresh, /post/auth/refresh_token/refresh id: dict-refresh-token-refresh order: 2 predicates: - Path=/dict/auth/refresh_token/refresh uri: http://10.98.176.2:11014
完整的Properties路由配置如下:
spring.cloud.gateway.routes[0].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[0].id = time-capsule-service spring.cloud.gateway.routes[0].order = 2 spring.cloud.gateway.routes[0].predicates[0] = Path=/tik/** spring.cloud.gateway.routes[0].uri = http://10.111.149.10:11015 spring.cloud.gateway.routes[1].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[1].id = fortune-service spring.cloud.gateway.routes[1].order = 2 spring.cloud.gateway.routes[1].predicates[0] = Path=/fortune/** spring.cloud.gateway.routes[1].uri = http://10.96.112.198:11015 spring.cloud.gateway.routes[2].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[2].id = dolphin-music-service spring.cloud.gateway.routes[2].predicates[0] = Path=/music/** spring.cloud.gateway.routes[2].uri = http://10.107.64.246:11014 spring.cloud.gateway.routes[3].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[3].id = dolphin-post-service spring.cloud.gateway.routes[3].predicates[0] = Path=/post/** spring.cloud.gateway.routes[3].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[4].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[4].id = dolphin-manage-service spring.cloud.gateway.routes[4].order = 2 spring.cloud.gateway.routes[4].predicates[0] = Path=/manage/** spring.cloud.gateway.routes[4].uri = http://10.106.240.158:11015 spring.cloud.gateway.routes[5].id = dolphin-login-service spring.cloud.gateway.routes[5].order = 0 spring.cloud.gateway.routes[5].predicates[0] = Path=/manage/admin/user/login,/fortune/user/login,/fortune/user/sms,/fortune/user/reg/verify,/fortune/user/guest/login,/dict/user/login spring.cloud.gateway.routes[5].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[6].id = dolphin-logout-service spring.cloud.gateway.routes[6].order = 0 spring.cloud.gateway.routes[6].predicates[0] = Path=/manage/admin/user/logout spring.cloud.gateway.routes[6].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[7].id = dolphin-login-current-admin-user spring.cloud.gateway.routes[7].order = 0 spring.cloud.gateway.routes[7].predicates[0] = Path=/manage/admin/user/current-user spring.cloud.gateway.routes[7].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[8].filters[0].name = JwtAuthentication spring.cloud.gateway.routes[8].id = dolphin-dict-service spring.cloud.gateway.routes[8].order = 3 spring.cloud.gateway.routes[8].predicates[0] = Path=/dict/** spring.cloud.gateway.routes[8].uri = http://10.97.100.34:11014 spring.cloud.gateway.routes[9].id = dict-auth spring.cloud.gateway.routes[9].order = 0 spring.cloud.gateway.routes[9].predicates[0] = Path=/dict/user/plugin/login spring.cloud.gateway.routes[9].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[10].filters[0] = RewritePath=/dict/auth/access_token/refresh, /post/auth/access_token/refresh spring.cloud.gateway.routes[10].id = dict-access-token-refresh spring.cloud.gateway.routes[10].order = 1 spring.cloud.gateway.routes[10].predicates[0] = Path=/dict/auth/access_token/refresh spring.cloud.gateway.routes[10].uri = http://10.98.176.2:11014 spring.cloud.gateway.routes[11].filters[0] = RewritePath=/dict/auth/refresh_token/refresh, /post/auth/refresh_token/refresh spring.cloud.gateway.routes[11].id = dict-refresh-token-refresh spring.cloud.gateway.routes[11].order = 2 spring.cloud.gateway.routes[11].predicates[0] = Path=/dict/auth/refresh_token/refresh spring.cloud.gateway.routes[11].uri = http://10.98.176.2:11014
原因分析
这不是配置遗漏,是转换工具的特性导致的:Properties格式中routes[9]表示数组的第10个元素(索引从0开始),转换工具会严格按照索引位置生成YAML数组,前面0-8的位置没有配置数据,就会自动填充null来占位,最终出现大量null项。
解决方案
1. 使用完整的Properties配置转换
你之前只截取了routes[9]-[11]的片段转换,导致工具补全前面的null。如果用提供的完整Properties配置(包含routes[0]-[11])进行转换,工具会生成完整的路由数组,不会出现null项。
2. 手动清理YAML中的null项
如果已经转换了片段配置,直接删除YAML中所有- null的行即可。Spring Gateway加载时会忽略这些无效的null项,正常识别有效的路由配置。清理后的YAML示例:
spring: cloud: gateway: routes: - id: dict-auth order: 0 predicates: - Path=/dict/user/plugin/login uri: http://10.98.176.2:11014 - filters: - RewritePath=/dict/auth/access_token/refresh, /post/auth/access_token/refresh id: dict-access-token-refresh order: 1 predicates: - Path=/dict/auth/access_token/refresh uri: http://10.98.176.2:11014 - filters: - RewritePath=/dict/auth/refresh_token/refresh, /post/auth/refresh_token/refresh id: dict-refresh-token-refresh order: 2 predicates: - Path=/dict/auth/refresh_token/refresh uri: http://10.98.176.2:11014
3. 手动编写标准YAML格式配置
直接把完整的Properties转换成YAML,避免依赖转换工具。完整的转换后YAML如下:
spring: cloud: gateway: routes: - filters: - name: JwtAuthentication id: time-capsule-service order: 2 predicates: - Path=/tik/** uri: http://10.111.149.10:11015 - filters: - name: JwtAuthentication id: fortune-service order: 2 predicates: - Path=/fortune/** uri: http://10.96.112.198:11015 - filters: - name: JwtAuthentication id: dolphin-music-service predicates: - Path=/music/** uri: http://10.107.64.246:11014 - filters: - name: JwtAuthentication id: dolphin-post-service predicates: - Path=/post/** uri: http://10.98.176.2:11014 - filters: - name: JwtAuthentication id: dolphin-manage-service order: 2 predicates: - Path=/manage/** uri: http://10.106.240.158:11015 - id: dolphin-login-service order: 0 predicates: - Path=/manage/admin/user/login,/fortune/user/login,/fortune/user/sms,/fortune/user/reg/verify,/fortune/user/guest/login,/dict/user/login uri: http://10.98.176.2:11014 - id: dolphin-logout-service order: 0 predicates: - Path=/manage/admin/user/logout uri: http://10.98.176.2:11014 - id: dolphin-login-current-admin-user order: 0 predicates: - Path=/manage/admin/user/current-user uri: http://10.98.176.2:11014 - filters: - name: JwtAuthentication id: dolphin-dict-service order: 3 predicates: - Path=/dict/** uri: http://10.97.100.34:11014 - id: dict-auth order: 0 predicates: - Path=/dict/user/plugin/login uri: http://10.98.176.2:11014 - filters: - RewritePath=/dict/auth/access_token/refresh, /post/auth/access_token/refresh id: dict-access-token-refresh order: 1 predicates: - Path=/dict/auth/access_token/refresh uri: http://10.98.176.2:11014 - filters: - RewritePath=/dict/auth/refresh_token/refresh, /post/auth/refresh_token/refresh id: dict-refresh-token-refresh order: 2 predicates: - Path=/dict/auth/refresh_token/refresh uri: http://10.98.176.2:11014
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

