Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查
  gpcBo7k6GxFf 2023年11月02日 57 0


背景

Kotlin作为一门JVM脚本语言,收到很多Java开发者的青睐。

项目采用Java+Kotlin混合编程。Spring Boot应用开发,不会发生变动的配置放在本地配置文件,可能会变化的配置放在远程Apollo Server。

问题

因为业务需要,需要增加一个可能会持续更新的配置,然后通过if else逻辑来加以判断。

apollo配置:

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_Kotlin


下面截图里的硬编码是未解决问题的 back-up 方案:

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_Kotlin_02


控制台打印:

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_Java_03


事实上,本地开发时,习惯性先实现业务逻辑,一开始并没有在Apollo新增配置screen.channel,而是采用上面图2里的硬编码方式:

@Value("\${screen.channel: xhwjk_screen}")
var screenChannel: String? = null

这种方式不会去读取本地配置文件,也不会读取Apollo Server的配置,直接设置一个default值,也就是xhwjk_screen,但断点调试时,拿不到数据。

在本地bootstrap.yml文件里新增配置:

screen:
  channel: xhwjk_screen,pdwjk_screen

另外application.yml里也试过增加相同的配置项。

结论都是:获取不到配置。

对比

相同的配置,放在一个Java Controller里面就没有问题:

@Slf4j
@RestController
@RequestMapping("/dialog")
public class AuthenticationCheckController {
    @Value("${screen.channel: xhwjk_screen}")
    private String screenChannel;

    @GetMapping(value = "/authentication")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void checkAuthentication() {
        LOGGER.info("ff:{}", screenChannel);
        // This resource just returns a 204 No Content in case the request is authenticated.
    }
}

控制台打印:

AuthenticationCheckController | checkAuthentication | 28 | - ff:xhwjk_screen,pdwjk_screen

注:
JDK版本:OpenJDK-11
Spring Boot版本:2.1.6.RELEASE
Spring Cloud版本:Greenwich.RELEASE
Kotlin版本:1.3.72

排查

尝试1

带着上面描述的问题现象搜索,找到stackoverflow-how-to-get-value-from-application-yml-in-springboot

Apollo新增一个配置:

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_硬编码_04


新增一个配置DialogConfig.kt类:

@Component
@ConfigurationProperties("dialog")
class DialogConfig {
    var screenChannel: String? = null
}

引用此配置:

@Resource
private val dialogConfig: DialogConfig? = null

仍然拿不到配置:

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_Kotlin_05

尝试2

找到另一篇stackoverflow-how-to-get-variable-from-spring-application-yaml-in-kotlin) 还是上面的DialogConfig.kt,引用配置:

@Resource
lateinit var dialogConfig: DialogConfig

直接报错:

kotlin.UninitializedPropertyAccessException: lateinit property dialogConfig has not been initialized

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_kotlin_06


参考:stackoverflow-uninitializedpropertyaccessexception,使用前判断一下,没有判断的必要,还是拿不到数据。

尝试3

DialogConfig变成Java类:

@Component
@ConfigurationProperties("dialog")
public class DialogConfig {
    public String screenChannel;
}

引用此配置:

@Resource
var dialogConfig: DialogConfig? = null

还是不行!

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查_kotlin_07

解决

实在没办法,硬编码解决问题,参考截图一。

吐了。。

秃了。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   53   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   107   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
gpcBo7k6GxFf