2012-01-26 15 views
9

Tengo una aplicación web con un archivo de configuración de primavera. Tengo la siguiente entrada:El resorte no cancela el arranque en la inicialización del bean. ¿Error cuando el escaneo del componente está habilitado?

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

La "vía migratoria de" grano se utiliza para inicializar y migrar el database.Now tengo otro grano de la definición de la fuente de datos de la aplicación debe utilizar:

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

éste depende en la ruta migratoria para tener éxito.

Todo funciona bien. Ahora, cuando el bean "flyway" arroja una excepción, el arranque de paradas de la primavera y el inicio de la aplicación webapp están terminados, todo bien.

Ahora estoy empezando a permitir Autowiring para ciertos componentes a través de:

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

en algunas de las clases que dependen de los servicios que también se definen como los frijoles en la configuración XML. y ellos dependen de la fuente de datos mencionada anteriormente.

ahora el problema: tan pronto como la aplicación de rutina de carga y ahora "la vía de migración" es una excepción excepción es tragado por la primavera en el apartado siguiente:

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; 
} 

y ahora surgen intentos, para cualquier otro servicio dependend (que depende de la fuente de datos y por lo tanto flyway) inicializar todos los granos que a su vez se traduce en el mismo procedimiento una y otra de nuevo.

Este ciclo excepcional continúa hasta que la primavera termina de intentar instantar todas las posibles dependencias en lugar de abortar después del primer error de la ruta migratoria.

Este extraño comportamiento sólo comienza cuando activo de exploración componente a través

<context:component-scan .... 

cuando esta función está desactivada la primavera se detiene después de acaecer el primer error ruta migratoria. También termina en otra clase:

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; 
     } 

por lo que este es el comportamiento que cabe esperar en el otro caso también.

nuestra versión de primavera: 3.0.6.RELEASE

este comportamiento también está presente con otras clases que lanzan cualquier execption tiempo de ejecución (no sólo flyway) se trata de un error o comportamiento esperado?

cualquier ayuda muy apreciada

Marcel

+7

¿Ha intentado poner '

+0

guau, eso parece funcionar. ¿Crees que debería abrir un error? o es este comportamiento previsto? – Marcel

+0

Es un comportamiento intencionado, porque al usar esta función, puede anular la configuración accionada por la anotación con su configuración XML. –

Respuesta

1

Ponga <context:component-scan... después de su declaración de granos en el archivo XML como dijo nico_ekito en los comentarios.

ha comprobado el funcionamiento:

Marcel: wow, que parece funcionar. ¿Crees que debería abrir un error? o es este comportamiento previsto?

Cuestiones relacionadas