2015-01-08 13 views
5

私は実行時に自動設定したい認証サービスを持っていますが、それは開発とテストのために模擬されます。 @ConfigurationProperties機能を使用して必要なパラメータを定義したいと思いますが、ライブサービスが設定されているかどうかに応じて、条件付きでAuthenticationManagerインスタンスを作成することもできる必要があります。@ConfigurationPropertiesのSpringブート条件

@ConditionalOnBean(AuthProperties.class)のようなものを使用していますが、 のプロパティを使用するかどうかにかかわらず、Springブートで@ConfigurationPropertiesクラスのBeanが作成されます。検証アノテーションをフィールドに適用することはできますが、ライブサービスが構成されていない場合は、コンテキストがまったく開始されません。

@ConfigurationPropertiesクラスで指定されたプロパティの設定セクションを条件付きにするには、プロパティ名を@ConditionalOnPropertyに繰り返すことなく明確な方法がありますか?

+0

'@ConfigurationProperties'オブジェクトは' @ ConditionalOnProperty'によって(もちろん)選択されないデフォルト値を指定するためにも使用できます。だからこれはまだまだ関連性の高い質問です。 – P44T

答えて

0

は、あなたは自分のapplication-some_profile.propertiesファイルのプロファイルを使用して、条件付きで、この

@Profile("some_profile") 
@Component 
@ConfigurationProperties(prefix = "some.selector") 

public Class YourConfiguration{ 
    private property option; 
} 

のようにそれだけであなたがライブまたはモック選択したプロファイルによっては条件付きで作成されたこの方法をあなたの特性Beanを作成できません。 @Configuration認証クラスには、選択したプロファイルを別々の方法で使用するか、@ConditionalOnBeanを続行することができます。それはプロファイルが何であるか、あるいは私がその質問を誤解したかのようなものです。

+1

Spring Boot自動設定システムの全体的なポイントは、冗長な情報、基本的にミニプロファイルを提供するトグルを指定することなく、外部設定情報に適応することです。 – chrylis

+0

私は気付かなかった申し訳ありませんがautoconfiguration.Nothingのクリーンは、私の心 @Component @ConfigurationProperties(接頭辞=「some.selector」) @Conditional(YourConfiguration.class) パブリッククラスYourConfigurationが条件{ 私有財産のオプションを実装しています。 \t @Override \t公共ブールマッチ(ConditionContextコンテキスト、AnnotatedTypeMetadataのメタデータ){ \t \t // \tリターン(システムをチェックし、いくつかのハードコードされたプロパティ。getProperty( "servicedefault")== null); \t} } 'クリーンではありませんが@コンディアディアルが動作します、コンディションに応じてBeanが登録されます。そうでなければ登録に失敗します – mariubog

0

私は同様の問題があったと私は春ブーツとJava 8を使用して、このアプローチでそれを解決することができ、それは誰かに役立ちます願っています:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:integration.properties"), 
    @PropertySource(value = "classpath:integration-${spring.profiles.active}.properties", ignoreResourceNotFound = true) 
}) 
@ConfigurationProperties(prefix = "integration") 
public class IntegrationProperties { 

    private String user; 

    private String password; 

    private String projectId; 

    .... 

} 

integration.properties

integration.user=User 
integration.password=Password 
integration.project-id=123 

統合を-prod.properties

integration.project-id=897 

Spring Bootはプロパティファイルを使用してBeanを作成し、プロダクション(プロファイルprodを使用)ではもう一方のファイルを使用してproject-idを上書きします。 ignoreResourceNotFound = trueは、起動時にprodプロファイルを使用していないときにFileNotFoundExceptionを回避します。