2012-01-26 7 views
9

Ho un'applicazione web con un file di configurazione a molla. Ho la seguente voce:Spring non interrompe il bootstrap sull'inizializzazione del bean Errore quando la scansione dei componenti è abilitata?

<bean id="flyway" class="xxx.FlywayTool" init-method="migrateOrFail"/> 

Il "Flyway" fagiolo viene utilizzato per inizializzare e migrare il database.Now ho un altro fagiolo definire l'origine dati l'applicazione deve utilizzare:

<bean id="dataSource" class="..." depends-on="flyway"> 

questo dipende su flyway per avere successo

Tutto funziona correttamente. Ora, quando il bean "flyway" lancia un'eccezione, il bootstrap dei fermi molla e l'avvio webapp sono finiti - tutto bene.

Ora sto iniziando a consentire autowiring per alcuni componenti attraverso:

<context:component-scan base-package="de.xxxxx.xxxxx" /> 

in alcune delle classi I dipendono da servizi che sono anche definiti come i fagioli nella configurazione XML. e loro girano dipendono dall'origine dati menzionata sopra.

ora il problema: non appena bootstrap l'applicazione ora e "Flyway" è un'eccezione l'eccezione viene inghiottita dalla molla nella sezione seguente:

org.springframework.beans.factory.support. AbstractBeanFactory.getTypeForFactoryBean (String, RootBeanDefinition)

catch (BeanCreationException ex) { 
    // Can only happen when getting a FactoryBean. 
    if (logger.isDebugEnabled()) { 
     logger.debug("Ignoring bean creation exception on FactoryBean type check: " + ex); 
    } 
    onSuppressedException(ex); 
    return null; 
} 

e ora molla tentativi, per ogni altro servizio dependend (che dipende l'origine dati e quindi Flyway) inizializzare tutti i fagioli che a sua volta provoca la stessa procedura ancora e ancora.

Questo ciclo eccezionale continua fino alla fine della primavera cercando di instanare ogni possibile dipendenza invece di interrompere dopo il primo errore di passaggio.

Questo strano comportamento inizia solo quando abilitare la scansione dei componenti tramite

<context:component-scan .... 

quando questa funzione è disabilitata la primavera si ferma dopo il primo errore flyway happend. E finisce anche in un'altra classe:

org.springframework.context.support.AbstractApplicationContext.refresh()

 catch (BeansException ex) { 
      // Destroy already created singletons to avoid dangling resources. 
      destroyBeans(); 

      // Reset 'active' flag. 
      cancelRefresh(ex); 

      // Propagate exception to caller. 
      throw ex; 
     } 

quindi questo è il comportamento mi aspetterei nell'altro caso troppo.

la nostra versione di primavera: 3.0.6.RELEASE

questo comportamento è presente anche con altre classi che gettano qualsiasi execption runtime (non solo Flyway) è presente un bug o comportamento previsto?

alcun aiuto molto apprezzato

Marcel

+7

Hai provato a inserire '

+0

wow, sembra funzionare. pensi che dovrei aprire un bug? o è questo comportamento previsto? – Marcel

+0

È un comportamento previsto, poiché utilizzando questa funzione, è possibile sovrascrivere la configurazione guidata dell'annotazione con la propria configurazione XML. –

risposta

1

Mettere <context:component-scan... dopo la vostra dichiarazione di fagioli nel file XML come detto nico_ekito nei commenti.

Confermato al lavoro:

Marcel: wow, che sembra funzionare. pensi che dovrei aprire un bug? o è questo comportamento previsto?

Problemi correlati