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があります。他のフィールドもあります。
私はあなたと同じ問題を抱えていました。ここに私のエラーコードがあります。
@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のコピーを知らず、値をどのように注入するかを知らなかったためです。
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」を出力します
私は、スプリングブートバージョン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;
}
その後、いつでもクラスを注入します。
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;
}
}
試してみてください
私は同様の問題を抱えており、上記の例はプロパティを読むのに役立ちません。以下のリンクでSpringBootアプリケーションのapplication.propertiesファイルからプロパティ値を読み取るのに役立つ完全なクラスを投稿しました。
OPにパッケージ宣言を含めていませんが、@SpringBootApplication
も@ComponentScan
も@Component
をスキャンしていない可能性があります。
@ComponentScan
Javadocの状態:
basePackageClasses
またはbasePackages
(またはそのエイリアスvalue
)のいずれかを指定して、スキャンする特定のパッケージを定義できます。特定のパッケージが定義されていない場合、この注釈を宣言するクラスのパッケージからスキャンが行われます。
ISTRはこれまで多くの時間を無駄にしていたため、単にアプリケーションクラスをアプリのパッケージツリーの最上位のパッケージに移動するのが最も簡単であることがわかりました。
最近、値の挿入が行われる前にプロパティが読み取られていたという落とし穴に遭遇しました。挿入された値を読み取ることができるのは@PostConstruct
が最も早いようで、Jesseの答えが役に立ちました。もちろん、Springにこれを呼び出させるべきです。
あなたが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);
}
}
問題は、構成にstatic
PropertySourcesPlaceholderConfigurer
Bean定義が必要なことです。私は非静的なものがあり、それが機能しなかったので、私は強調して静的と言います。
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}