2016-06-30 16 views
6

Fondamentalmente ho un bean in Spring che volevo attivare solo quando 2 profili sono attivi. In sostanza, sarebbe come:Spring: profili multipli attivi

@Profile({"Tomcat", "Linux"}) 
public class AppConfigMongodbLinux{...} 

@Profile({"Tomcat", "WindowsLocal"}) 
public class AppConfigMongodbWindowsLocal{...} 

Così mi piacerebbe che quando uso -Dspring.profiles.active=Tomcat,WindowsLocal, che avrebbe cercato di utilizzare solo il AppConfigMongodbWindowsLocal, ma cerca ancora di registrare il AppConfigMongodbLinux.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfigMongodbLinux': Injection of autowired dependencies failed 

E 'possibile rendere il bean registrato solo quando entrambi i profili sono attivi o lo sto utilizzando in modo errato? :)

Grazie !!


Modifica: registrazione dello stack completo.

L'errore si trova effettivamente su una proprietà mancante nelle proprietà, ma questo bean verrà attivato? Volevo capire questo al fine di garantire non sto attivando un fagiolo sbagliato ..

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]] 
    ... 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfigMongodbLinux': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.Integer mycompany.config.AppConfigMongodbLinux.mongoPort; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'mongo.port' in string value "${mongo.port}" 
    ... 40 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.Integer mycompany.config.AppConfigMongodbLinux.mongoPort; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'mongo.port' in string value "${mongo.port}" 
    ... 
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'mongo.port' in string value "${mongo.port}" 
+1

Questo non sembra un problema con i profili. Controlla se i bean autowired in appConfigMongodbLinux sono disponibili. Pubblica traccia dello stack completo. –

+1

@ShankarPS Sembra un problema con i profili. Un file di configurazione che non desidera attivare sta cercando una proprietà non disponibile in quella configurazione. – chrylis

risposta

5

Purtroppo, @Profile attiva se qualsiasi profilo elencato è attiva. Ci sono un paio di modi per aggirare questo.

  • Applicare comune @Profile("Tomcat") nota ad una classe di configurazione di livello superiore, e quindi applicare @Profile("Windows") ad una classe di configurazione annidata (metodo o @Bean).
  • Se Spring Boot è accettabile come dipendenza, utilizzare @AllNestedConditions per creare un'annotazione che sia il AND invece dell'OR.

Sembra che quello che si sta tentando di fare sarebbe pulito da scrivere se si usassero classi di autoconfigurazione Spring Boot; se è pratico introdurre l'autoconfigurazione in questa fase del ciclo di vita dell'applicazione, ti consiglio di prenderlo in considerazione.

+2

Oppure un'implementazione della condizione come https://gist.github.com/zapl/1262d21b8866ebc61e48ece505277f69 derivata da '@ Profile' – zapl

+0

Uso SpringBoot! Dò un'occhiata all'annotazione che hai detto, ma ha molto senso anche la prima opzione .. Grazie !! –

Problemi correlati