2017-11-24 3 views
1

私は、いずれかのソースからデータを取得するスプリングブートWebサービスを作成するはずです&残りのapiは(/ fetchData/{src})srcはパス変数です&ソースの名前ですデータベース)例えばcasandra、mongodbまたは他のnosql ..それに基づいて、そのデータベースとの接続を確立するためにBeanを初期化する必要があります。このような場合に@Conditional Beanを使用することができます。その問題は、プロパティファイル値&に基づく@条件付きBeanチェック条件ここでは、残りのAPIのパスパラメータに基づいて条件を適用する必要があります。したがって、@ Conditionや他のデザインパターンを工場のように使うべきですか?春のブート時に残りのAPIのパスパラメータに基づいて@Conditional Beanを実装できますか?

答えて

2

@Conditionalは、起動時に評価されるため、パスパラメータ値は実行時にのみ認識されるため、使用できません。

解決策はたくさんあります。シンプルな工場やチェーンを使うことができます。

私はいくつかの時間に使用される別の例:インターフェース

public interface MyDataSource { 
    SomeOutputData query(Data someDataIn); 
    boolean supports(String pathParam); 
} 

すべての実装(カサンドラ、MongoDBは、など)を作成を作成し、サービスにこれらのリストを注入

@Autowired 
private List<MyDataSource> dataSources; 

次に、次のような適切なデータソースを選択できます。

dataSources.stream() 
     .filter(dataSource -> dataSource.doesSupport(pathParam) 
     .findFirst() 
     .orElseThrow(() -> new IllegalArgumentException("No datasource")) 
     .query(dataIn); 
+0

ご意見ありがとうございます。私も@conditionalは開始時に評価され、path変数は実行時にのみ認識されるので、私はそれを使うことはできません。貴重なご意見をいただきありがとうございます。 –

関連する問題