web-dev-qa-db-ja.com

Spring Boot:@Valueは常にnullを返します

別のクラスのメソッドに渡すために、application.propertiesファイルの値を使用したいと思います。問題は、値が常にNULLを返すことです。何が問題なのでしょうか?前もって感謝します。

application.properties

filesystem.directory=temp

FileSystem.Java

@Value("${filesystem.directory}")
private static String directory;
10

静的変数で@Valueを使用することはできません。非静的としてマークするか、静的変数に値を注入する方法をこちらで確認する必要があります。

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/

編集:将来リンクが壊れた場合に備えて。これを行うには、静的変数の非静的セッターを作成します。

@Component
public class MyComponent {

    private static String directory;

    @Value("${filesystem.directory}")
    public void setDirectory(String value) {
        this.directory = value;
    }
}

ただし、クラスはSpring Beanである必要があります。そうしないと、インスタンス化されず、セッターにSpringからアクセスできなくなります。

20
Plog

@Plogの答えとは別に、クロスチェックすることはほとんどありません。

static変数には値を注入できません。 @Plogの答えを確認してください。

  • クラスに@Componentまたは@Serviceの注釈が付けられていることを確認してください
  • コンポーネントスキャンは、Beanを登録するためにパッケージをスキャンします。 XMLが構成を有効にしている場合は、XMLを確認してください。
  • プロパティファイルのパスが正しいか、またはクラスパスにあるかどうかを確認してください。
5
Karthik R

他の答えはおそらくOPにとって正しいでしょう。

ただし、同じ症状(@Value- annotated fields are null)に遭遇しましたが、根本的な問題は異なります。

import com.google.api.client.util.Value;

正しい@Value注釈クラスをインポートしていることを確認してください!特に最近のIDEの利便性により、これは非常に簡単な間違いです(私はIntelliJを使用していますが、自動インポートしているものを読まずに自動インポートするのが速すぎると、私がしたように数時間を無駄にするかもしれません)。

もちろん、インポートする正しいクラスは次のとおりです。

import org.springframework.beans.factory.annotation.Value;

2
scottyseus