背景
JVM スクリプト言語として、Kotlin は多くの Java 開発者に好まれています。
このプロジェクトでは Java+Kotlin 混合プログラミングを使用します。Spring Boot アプリケーション開発では、変更されない設定はローカル設定ファイルに配置され、変更される可能性のある設定はリモート Apollo Server に配置されます。
質問
ビジネスニーズのため、継続的に更新される可能性のある構成を追加し、if else
ロジックで判断する必要があります。
Apollo 設定:
以下のスクリーンショットのハード コーディングは、未解決の問題に対するバックアップ ソリューションです:
コンソール印刷:
実際、ローカルで開発する場合は、最初にビジネス ロジックを実装するのが通例です。最初は、新しい設定はありませんでした。 Apollo ではscreen.channel
、上の図 2 のハードコーディング方法を使用しています。
@Value("\${screen.channel: xhwjk_screen}")
var screenChannel: String? = null
このメソッドは、ローカル設定ファイルも Apollo Server 設定も読み取らず、デフォルト値を直接設定します。つまり、xhwjk_screen
ブレークポイントのデバッグ中はデータを取得できません。
ローカルファイルbootstrap.yml
に構成を追加します。
screen:
channel: xhwjk_screen,pdwjk_screen
application.yml
同じ設定項目も追加してみました。
結論としては、構成を取得できません。
比較した
同じ設定を Java コントローラーに問題なく配置できます。
@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 は新しい設定を追加します。
新しい設定DialogConfig.kt
クラスを追加します。
@Component
@ConfigurationProperties("dialog")
class DialogConfig {
var screenChannel: String? = null
}
この設定を引用すると、
@Resource
private val dialogConfig: DialogConfig? = null
まだ構成を取得できません:
試してみる 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
参考: stackoverflow-uninitializedpropertyaccessException . 判断してから使用してください. 判断する必要はありませんが、それでもデータを取得できません。
試してみましょう 3
DialogConfig は Java クラスになります。
@Component
@ConfigurationProperties("dialog")
public class DialogConfig {
public String screenChannel;
}
この設定を引用すると、
@Resource
var dialogConfig: DialogConfig? = null
か否か!
解決する
本当に方法はありません。ハードコーディングによって問題が解決されます。スクリーンショット 1 を参照してください。
嘔吐した。。
ハゲ。