web-dev-qa-db-ja.com

Spring-Bootマルチモジュールプロジェクトロードプロパティファイル

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が発生します。

19
Daniel

フィールド注入の場合:

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();
    }
6
Subash J

自動配線は、オブジェクトの作成直後(リフレクション経由でコンストラクターを呼び出した後)に実行されます。したがって、コンストラクタの呼び出し中に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;
    }
}

あなたの設定の残りは私には正しいようです。

お役に立てれば。

5
skadya

以下は、異なるモジュールのプロパティを取得できるSpring Bootマルチモジュールの例です。メインapplication module、dataparse-moduledatasave-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();

    }
}
3
Kirill Ch

前にこのような状況がありましたが、プロパティファイルがjarにコピーされていないことに気付きました。

私はそれを機能させるために以下を作りました:

  1. Resourcesフォルダーに一意のパッケージを作成し、application.propertiesファイルをその中に保存しました。例:com/company/project

  2. 構成ファイル(例:TMDBConfig.Java)で、.propertiesファイルの絶対パスを参照しました。

    @Configuration
    @PropertySource("classpath:/com/company/project/application.properties")
    public class AwsConfig
    

ビルドして実行すると、魔法のように機能します。

1

自動配線して 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()メソッドを呼び出したときにコンテキストからプロパティが読み取られることが保証されます。

0
Karol Dowbecki