エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

システムプロパティを@Valueで取得できなかったときの調査と対処法

経緯

システムプロパティに設定した値を読み込もうとしたが、なかなか読み込めず、悶々としていた。
chatGPTを使って調べたりもしたが、行き詰まっていて、もう関係するソースを載せて聞いてみようと思って聞いたら、俺のPONだったことに気づいたので、戒めとして書きたくなったから。

環境

SpringBoot
Java11
dotenv-java

やりたかったこと

.envファイルの内容を読み込んで、Spring内で利用したかった。

自分がやったこと

まずは、mainクラスにてSpringApplication.runする前に、下記の.envファイルを読み込む記述を追記

    Dotenv dotenv = Dotenv.load();
    dotenv.entries()
        .forEach(dotenvEntry -> System.setProperty(dotenvEntry.getKey(), dotenvEntry.getValue()));

なお、gitignoreで.envはコミット対象外にしてある。
公開されたら不味い情報は、扱いに気をつけないとな

.envファイルには、下記が記載されているものとする。

minhon.name=aaaaa

で、読み込ませないので下記の実装をした。

  @Value("${minhon.name}")
  private static String NAME = "";

おわかりいただけだろうか?

問題点は、ソース見てわかる人は、すぐ分かる。
問題は、static変数になっているところ。。。。
static変数は、インスタンス変数とは違うので、注入できていなかったのが原因

これに引っかかって、半日以上悩んでた。。。

chatGPTに相談した内容

まずは、System.out.println(System.getProperty("minhon.name"));で表示されるか確認しろと言われた。
当然、できていたので、表示できていた旨を伝え、@Valueを利用している箇所を記載して伝えたら、下記のように言われた

@Valueアノテーションでプロパティを注入する場合、staticキーワードを使用することはできません。staticフィールドに注入しようとすると、Springはインスタンス化されていないオブジェクトに値を注入しようとしてエラーが発生します。

気づいた瞬間、台パンしてたわ。。。

@Value使う前は、定数として設定して試していたので、気づかなかったが、@Valueに変えた際に、finalだけ消してしまっていたので、staticが残っていた。。。

感想

つまらんミスに悩まされ続けた。。。

別な実装部分が影響しているのか悩んでいたが、やっぱり俺の設定が問題だった。。。

chatGPTを問題解決に利用したが、思ったより役にたった。
ただ、ソースを載せないと、濡れてに泡状態で、解決はできなかった。
ソース載せたら、原因箇所を潰して行く手法を提案してくれるので、だいぶ楽だった。
実際の業務では使えんだろうな。。。
実装が外に漏れるから。
なにかに置き換えればいいけど、面倒なんだよな。。。
基本的に、業務でchatGPT使うことの注意点は、連携するデータを意識できるかどうかだと思ってる。