Kotlin の実戦: ローカル設定ファイルとリモート Apollo 設定の取得失敗のトラブルシューティング

背景

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 を参照してください。

嘔吐した。

ハゲ。

おすすめ

転載: blog.csdn.net/lonelymanontheway/article/details/132305665