2015-01-08 13 views
5

Ho un servizio di autenticazione che desidero autoconfigurare in fase di runtime ma che verrà messo a punto per lo sviluppo e il testing. Vorrei utilizzare la funzione @ConfigurationProperties per definire i parametri necessari, ma devo anche essere in grado di creare solo condizionatamente le istanze AuthenticationManager, a seconda che sia configurato un servizio live.Spring Boot condizionale su @ConfigurationProperties

L'approccio che vorrei adottare è quello di utilizzare qualcosa come @ConditionalOnBean(AuthProperties.class), ma Spring Boot crea un bean della mia classe @ConfigurationProperties indipendentemente dal fatto che le proprietà siano presenti. Posso applicare annotazioni di convalida ai campi, ma il contesto non verrà avviato affatto se un servizio live non è configurato.

Esiste un modo pulito per rendere condizionale una sezione di configurazione in modo che le proprietà siano specificate in una classe @ConfigurationProperties senza ripetere i nomi di proprietà in @ConditionalOnProperty?

+0

Gli oggetti '@ ConfigurationProperties' possono anche essere utilizzati per specificare valori predefiniti, che (ovviamente) non vengono rilevati da' @ ConditionalOnProperty'. Quindi questa è ancora una domanda molto pertinente. – P44T

risposta

0

Non puoi semplicemente usare il profilo del file application-some_profile.properties e quindi creare la vostra proprietà di fagioli condizionalmente come questo

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

public Class YourConfiguration{ 
    private property option; 
} 

questo modo viene creato solo condizionatamente a seconda di quale profilo si seleziona dal vivo o finto . Quindi è possibile utilizzare il profilo selezionato per le classi di autenticazione @Configuration per approcci separati o seguire con @ConditionalOnBean. Ecco a cosa servono i profili o forse ho frainteso la domanda.

+1

L'intero punto del sistema di autoconfigurazione Spring Boot è quello di adattarsi alle informazioni di configurazione esterne senza dover specificare commutatori che forniscono solo informazioni ridondanti, essenzialmente mini-profili. – chrylis

+0

dispiace Non ho notato autoconfiguration.Nothing pulito viene in mente @Component @ConfigurationProperties (prefix = "some.selector") @Conditional (YourConfiguration.class) pubblico Classe YourConfiguration implementa Condizione { opzione proprietà privata; \t @Override \t partite pubbliche booleani (contesto ConditionContext, AnnotatedTypeMetadata metadati) { \t \t // alcune proprietà hardcoded controllo \t ritorno (Sistema.getProperty ("servicedefault") == null); } } 'non pulito ma questo è il modo in cui @Condidional funziona, il bean verrà registrato in base alle condizioni altrimenti non riesce a registrarsi – mariubog

0

ho avuto un problema simile e ho potuto risolverlo con questo approccio utilizzando primavera Boot e Java 8, spero che aiuta qualcuno:

@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 

integrazione -prod.properties

integration.project-id=897 

Spring Boot creerà il bean utilizzando il file delle proprietà e per la produzione (utilizzando il profilo prod) utilizzerà l'altro file e sostituirà lo project-id. Lo ignoreResourceNotFound = true eviterà FileNotFoundException all'avvio quando non si utilizza il profilo prod.