Comment puis-je m'assurer dépendant des configurations sont initialisés avec le Printemps, @Configuration d'annotation?

Je suis en train d'utiliser @Configuration annotations au fil de mon application, mais je reçois un NullPointerException dans l'un des initialiseurs parce que le haricot, il se réfère n'est pas encore initialisée (je pense). J'ai essayé en précisant dans l'web.xml juste la 'racine' config classe et également essayé de faire un package d'analyse et ne semblent travailler.

Désolé du gros code dump. J'ai essayé de produire un beaucoup plus simple ensemble de classes pour reproduire le problème, mais bien sûr, quand je l'ai fait, tout a bien fonctionné. Voici mes classes (importations élidée):

DataSourceConfig.java:

@Configuration
public class DataSourceConfig {

    public DataSourceConfig() {
        System.err.println("DataSourceConfig constructed...");
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource bean = new BasicDataSource();
        bean.setDriverClassName("com.mysql.jdbc.Driver");
        bean.setUrl("jdbc:mysql://localhost:3306/observation");
        bean.setUsername("observation");
        bean.setPassword("*******");
        bean.setInitialSize(1);
        bean.setMaxActive(5);
        bean.setTestOnBorrow(true);
        System.err.println("dataSource bean initialized: " + bean.toString());
        return bean;
    }
}

HibernateConfig.java

@Configuration
@Import(DataSourceConfig.class)
public class HibernateConfig {
public HibernateConfig() {
System.err.println("HibernateConfig constructing...");
}
@Autowired
private DataSourceConfig dataSourceConfig;
@Bean
protected NamingStrategy namingStrategy() {
return new ImprovedNamingStrategy();
}
private AnnotationSessionFactoryBean sessionFactoryBean = null;
@Bean
@DependsOn("dataSourceConfig")
public AnnotationSessionFactoryBean sessionFactory() {
if (sessionFactoryBean == null) {
sessionFactoryBean = new AnnotationSessionFactoryBean();
NPE Here--> sessionFactoryBean.setDataSource(dataSourceConfig.dataSource()); 
sessionFactoryBean.setSchemaUpdate(true);
sessionFactoryBean.setNamingStrategy(namingStrategy());
sessionFactoryBean.setPackagesToScan(new String[] {
"com.newco.observations.domain",
"com.newco.observations.domain.*" });
Properties props = new Properties();
props.setProperty("hibernate.default_schema", "observation");
props.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQLDialect");
props.setProperty("hibernate.show_sql", "true");
sessionFactoryBean.setHibernateProperties(props);
System.err.println("sessionFactory initialized");
}
return sessionFactoryBean;
}
@Bean
@DependsOn("dataSourceConfig")
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSourceConfig.dataSource());
}
@Bean
@DependsOn("sessionFactory")
public ResourceTransactionManager txManager() {
HibernateTransactionManager bean = new HibernateTransactionManager();
bean.setSessionFactory((SessionFactory) sessionFactory().getObject());
return bean;
}
@Bean
@DependsOn("sessionFactory")
public HibernateTemplate hibernateTemplate() {
return new HibernateTemplate((SessionFactory) sessionFactory()
.getObject());
}
}

DaoConfig.java:

@Configuration
@Import(HibernateConfig.class)
public class DaoConfig {
public DaoConfig()
{
System.err.println("DaoConfig constructing...");
}
private @Autowired HibernateConfig hibernateConfig;
@Bean
@DependsOn("hibernateTemplate")
public PhenomenonGroupDao phenomenonGroupDao()
{
PhenomenonGroupDaoImpl bean = new PhenomenonGroupDaoImpl();
bean.setHibernateTemplate(hibernateConfig.hibernateTemplate());
return bean;
}
@Bean
@DependsOn("hibernateTemplate")
public PhenomenonDao phenomenonDao()
{
PhenomenonDaoImpl bean = new PhenomenonDaoImpl();
bean.setHibernateTemplate(hibernateConfig.hibernateTemplate());
return bean;
}
@Bean
@DependsOn("hibernateTemplate")
public DiscretePhenomenonDao discretePhenomenonDao()
{
DiscretePhenomenonDaoImpl bean = new DiscretePhenomenonDaoImpl();
bean.setHibernateTemplate(hibernateConfig.hibernateTemplate());
return bean;
}
}

Vous pouvez le voir dans le Système.err.println et de l' @DependsOn annotations d'un genre de gesticulations sur que je suis en train de faire.

Je peux fournir le log complet si c'est utile, mais voici ce que je pense sont les lignes (avec un peu de mise en forme pour le rendre plus lisible (peut-être)):

  • 208 [Thread-0] INFO org.springframework.contexte.annotation.ConfigurationClassEnhancer
  • Réussi à améliorer com.bjk.de l'observation.serveur.config.DaoConfig; amélioré le nom de la classe est: com.bjk.de l'observation.serveur.config.DaoConfig$$EnhancerByCGLIB$$96e1956
  • 229 [Thread-0] INFO org.springframework.les haricots.usine.de soutien.DefaultListableBeanFactory
  • Pré-instanciation des singletons dans org.springframework.beans.factory.support.DefaultListableBeanFactory@185572a: la définition des haricots [org.springframework.contexte.annotation.internalConfigurationAnnotationProcessor, org.springframework.contexte.annotation.internalAutowiredAnnotationProcessor, org.springframework.contexte.annotation.internalRequiredAnnotationProcessor, org.springframework.contexte.annotation.internalCommonAnnotationProcessor, org.springframework.contexte.annotation.internalPersistenceAnnotationProcessor, daoConfig,com.bjk.de l'observation.serveur.config.DataSourceConfig#0, source de données, com.bjk.de l'observation.serveur.config.HibernateConfig#0, namingStrategy, sessionFactory, jdbcTemplate, txManager, hibernateTemplate, phenomenonGroupDao, phenomenonDao, discretePhenomenonDao]; racine de l'usine de la hiérarchie DaoConfig la construction...
  • 252 [Thread-0] INFO org.springframework.les haricots.usine.de soutien.DefaultListableBeanFactory
  • Détruire les singletons dans org.springframework.beans.factory.support.DefaultListableBeanFactory@185572a: la définition des haricots [org.springframework.contexte.annotation.internalConfigurationAnnotationProcessor, org.springframework.contexte.annotation.internalAutowiredAnnotationProcessor, org.springframework.contexte.annotation.internalRequiredAnnotationProcessor, org.springframework.contexte.annotation.internalCommonAnnotationProcessor, org.springframework.contexte.annotation.internalPersistenceAnnotationProcessor, daoConfig, com.bjk.de l'observation.serveur.config.DataSourceConfig#0, source de données, com.bjk.de l'observation.serveur.config.HibernateConfig#0, namingStrategy, sessionFactory, jdbcTemplate, txManager, hibernateTemplate, phenomenonGroupDao, phenomenonDao, discretePhenomenonDao]; racine de l'usine de la hiérarchie
  • 253 [Thread-0] ERREUR org.springframework.web.contexte.ContextLoader
  • Contexte échec de l'initialisation de org.springframework.les haricots.usine.BeanCreationException: Erreur lors de la création de haricots avec le nom "daoConfig': Injection de autocâblés dépendances a échoué; nested exception est org.springframework.les haricots.usine.BeanCreationException: ne Peut pas autowire domaine privé: com.bjk.de l'observation.serveur.config.HibernateConfig com.bjk.de l'observation.serveur.config.DaoConfig.hibernateConfig; nested exception est org.springframework.les haricots.usine.BeanCreationException: Erreur lors de la création de haricots avec le nom " com.bjk.de l'observation.serveur.config.HibernateConfig#0': Instanciation de haricot échoué; nested exception est org.springframework.les haricots.BeanInstantiationException: impossible d'instancier la classe d'haricot [com.bjk.de l'observation.serveur.config.HibernateConfig]: Constructeur a jeté exception; nested exception java.lang.NullPointerException

OriginalL'auteur jhericks | 2010-07-16