Mavenのマルチモジュールプロジェクトとして、Spring-Boot-Applicationがあります。構造は次のとおりです。
_Parent-Project
|--MainApplication
|--Module1
|--ModuleN
_
MainApplication
プロジェクトには、_@SpringBootApplication
_などの注釈が付けられたmain()
メソッドクラスがあります。このプロジェクトには、いつものように、自動的にロードされるapplication.propertiesファイルがあります。したがって、_@Value
_アノテーションを使用して値にアクセスできます
_@Value("${myapp.api-key}")
private String apiKey;
_
Module1内で、モジュール構成が格納されているプロパティファイル(module1.propertiesと呼ばれる)も使用します。このファイルは、モジュール内でのみアクセスおよび使用されます。しかし、ロードできません。 _@Configuration
_と_@PropertySource
_で試しましたが、運はありませんでした。
_@Configuration
@PropertySource(value = "classpath:module1.properties")
public class ConfigClass {
_
Spring-Bootでプロパティファイルをロードし、値に簡単にアクセスするにはどうすればよいですか?有効なソリューションが見つかりませんでした。
私の設定
_@Configuration
@PropertySource(value = "classpath:tmdb.properties")
public class TMDbConfig {
@Value("${moviedb.tmdb.api-key}")
private String apiKey;
public String getApiKey() {
return apiKey;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
_
構成の呼び出し
_@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
public TMDbWarper(){
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
_
ワーパーを自動配線すると、コンストラクターでNullPointerExceptionが発生します。
フィールド注入の場合:
Beanの構築直後、設定メソッドが呼び出される前に、フィールドが注入されます。このような構成フィールドはパブリックである必要はありません。完全な使用法については、 自動配線注釈 を参照してください。この場合、次のようにコンストラクター注入を使用します。
@Component
public class TMDbWarper {
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
@Autowired
public TMDbWarper(final TMDbConfig tmdbConfig){
this.tmdbConfig = tmdbConfig;
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
(または)
使用する @PostConstruct
以下のように初期化する:
@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
@PostConstruct
public void init() {
// any initialisation method
tmdbConfig.getConfig();
}
自動配線は、オブジェクトの作成直後(リフレクション経由でコンストラクターを呼び出した後)に実行されます。したがって、コンストラクタの呼び出し中にNullPointerException
フィールドはnullになるため、コンストラクタにはtmdbConfig
が必要です。
これを修正するには、以下に示すように@PostConstructコールバックメソッドを使用します。
@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
public TMDbWarper() {
}
@PostConstruct
public void init() {
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
public TmdbApi getTmdbApi() {
return this.tmdbApi;
}
}
あなたの設定の残りは私には正しいようです。
お役に立てれば。
以下は、異なるモジュールのプロパティを取得できるSpring Bootマルチモジュールの例です。メインapplication module、dataparse-module、datasave-module。があるとします
StartApp.Javain applicationモジュール:
@SpringBootApplication
public class StartApp {
public static void main(String[] args) {
SpringApplication.run(StartApp.class, args);
}
}
dataparse-moduleの設定。 ParseConfig.Java:
@Configuration
public class ParseConfig {
@Bean
public XmlParseService xmlParseService() {
return new XmlParseService();
}
}
XmlParseService.Java:
@Service
public class XmlParseService {...}
datasave-moduleの設定。 SaveConfig.Java:
@Configuration
@EnableConfigurationProperties(ServiceProperties.class)
@Import(ParseConfig.class)//get beans from dataparse-module - in this case XmlParseService
public class SaveConfig {
@Bean
public SaveXmlService saveXmlService() {
return new SaveXmlService();
}
}
ServiceProperties.Java:
@ConfigurationProperties("datasave")
public class ServiceProperties {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
application.propertiesin datasave-module inresource/configフォルダー:
datasave.message =マルチモジュールMavenプロジェクト!
threads.xml.number = 5
file.location.on.disk = D:\ temp\registry
次に、datasave-moduleで、@ Valueを介してすべてのプロパティを使用できます。
SaveXmlService.Java:
@Service
public class SaveXmlService {
@Autowired
XmlParseService xmlParseService;
@Value("${file.location.on.disk: none}")
private String fileLocation;
@Value("${threads.xml.number: 3}")
private int numberOfXmlThreads;
...
}
またはServicePropertiesを介して:
Service.Java:
@Component
public class Service {
@Autowired
ServiceProperties serviceProperties;
public String message() {
return serviceProperties.getMessage();
}
}
前にこのような状況がありましたが、プロパティファイルがjarにコピーされていないことに気付きました。
私はそれを機能させるために以下を作りました:
Resourcesフォルダーに一意のパッケージを作成し、application.propertiesファイルをその中に保存しました。例:com/company/project
構成ファイル(例:TMDBConfig.Java)で、.propertiesファイルの絶対パスを参照しました。
@Configuration
@PropertySource("classpath:/com/company/project/application.properties")
public class AwsConfig
ビルドして実行すると、魔法のように機能します。
自動配線して Enviornment
Beanを使用してプロパティを読み取ることができます
_@Configuration
@PropertySource(value = "classpath:tmdb.properties")
public class TMDbConfig {
@Autowired
private Environment env;
public String getApiKey() {
return env.getRequiredProperty("moviedb.tmdb.api-key");
}
}
_
これにより、PropertySourcesPlaceholderConfigurer
によって_@Value
_式がいつ解決されるかに関係なく、getApiKey()
メソッドを呼び出したときにコンテキストからプロパティが読み取られることが保証されます。