web-dev-qa-db-ja.com

Spring Boot @Valueプロパティ

Spring Bootアプリケーションがあり、クラスの1つで、@Valueを使用してapplication.propertiesファイルからプロパティを参照しようとしています。ただし、プロパティは解決されません。私は同様の投稿を見て、提案に従ってみましたが、それは助けにはなりませんでした。クラスは次のとおりです。

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

application.propertiesにプロパティfile.directoryがあります。他のフィールドもあります。

26
user6641655

私はあなたと同じ問題を抱えていました。ここに私のエラーコードがあります。

@Component
public class GetExprsAndEnvId {
    @Value("hello")
    private String Mysecret;


    public GetExprsAndEnvId() {
        System.out.println("construct");
    }


    public void print(){
        System.out.println(this.Mysecret);
    }


    public String getMysecret() {
        return Mysecret;
    }

    public void setMysecret(String mysecret) {
        Mysecret = mysecret;
    }
}

これはこのような問題ではありませんが、次のように使用する必要があります。

@Autowired
private GetExprsAndEnvId getExprsAndEnvId;

これは好きではありません:

getExprsAndEnvId = new GetExprsAndEnvId();

ここでは、@ Valueアノテーションが付けられたフィールドはnullです。これは、Springがnewで作成されたGetExprsAndEnvIdのコピーを知らず、値をどのように注入するかを知らなかったためです。

18
牛向辉

Application.propertiesファイルがsrc/main/resources/application.propertiesの下にあることを確認してください。行く方法の1つです。次に、次のように@PostConstructを追加します

サンプルApplication.properties

file.directory = somePlaceOverHere

サンプルJavaクラス

@ComponentScan
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  @PostConstruct
  public void print() {
    System.out.println(fileDirectory);
  }
}

上記のコードは「somePlaceOverhere」を出力します

14
Jesse

私は、スプリングブートバージョン1.4.0を使用したことを言及したいと思います。

@Component
public class MongoConnection {

@Value("${spring.data.mongodb.Host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;
}

その後、いつでもクラスを注入します。

6
Peter S.

Application.propertiesから値を読み取るには、メインクラスに@SpringBootApplicationと@Componentまたはさまざまなもので読み取るクラスに注釈を付ける必要があります。以下はapplication.propertiesから値を読み取ったサンプルで、Webサービスが呼び出されたときに正常に機能しています。同じコードをそのままデプロイし、 http:// localhost:8080/hello からアクセスしようとすると、キーメッセージのapplication.propertiesに保存した値が取得されます。

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${message}")
    private String message;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RequestMapping("/hello")
    String home() {
        return message;
    }

}

試してみてください

2
rajadilipkolli

私は同様の問題を抱えており、上記の例はプロパティを読むのに役立ちません。以下のリンクでSpringBootアプリケーションのapplication.propertiesファイルからプロパティ値を読み取るのに役立つ完全なクラスを投稿しました。

スプリングブート-環境@AutowiredはNullPointerExceptionをスローします

1
Nallamachu

OPにパッケージ宣言を含めていませんが、@SpringBootApplication@ComponentScan@Componentをスキャンしていない可能性があります。

@ComponentScan Javadocの状態:

basePackageClassesまたはbasePackages(またはそのエイリアスvalue)のいずれかを指定して、スキャンする特定のパッケージを定義できます。特定のパッケージが定義されていない場合、この注釈を宣言するクラスのパッケージからスキャンが行われます。

ISTRはこれまで多くの時間を無駄にしていたため、単にアプリケーションクラスをアプリのパッケージツリーの最上位のパッケージに移動するのが最も簡単であることがわかりました。

最近、値の挿入が行われる前にプロパティが読み取られていたという落とし穴に遭遇しました。挿入された値を読み取ることができるのは@PostConstructが最も早いようで、Jesseの答えが役に立ちました。もちろん、Springにこれを呼び出させるべきです。

0
Simon Gibbs

あなたがSpringブートを使用しているので、それが現在機能しないと思う唯一の方法は、@PropertySourceアノテーションを追加していないからです。

試してみて、フィードバックをお聞かせください。ありがとう!

@Configuration
@ComponentScan
@PropertySource("classpath:/application.properties")
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}
0
kukkuz

問題は、構成にstaticPropertySourcesPlaceholderConfigurer Bean定義が必要なことです。私は非静的なものがあり、それが機能しなかったので、私は強調して静的と言います。

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
0
Dormouse