2010-07-16 18 views
5

Uygulamamı bağlamak için @ Yapılandırma ek açıklamalarını kullanmaya çalışıyorum ancak başlatılan çekirdek henüz başlatılmamış olduğundan (örneğin, sanırım) başlatıcılardan birinde bir NullPointerException almaya devam ediyorum. Web.xml dosyasında sadece 'root' config sınıfını belirtmeyi denedim ve ayrıca bir paket taraması yapmayı denedim ve işe yaramadı.Bağlantılı yapılandırmaların Spring @Configuration ek açıklaması ile başlatıldığından nasıl emin olabilirim?

Büyük kod dökümü için özür dilerim. Sorunu yeniden oluşturmak için çok daha basit bir sınıf kümesi oluşturmaya çalıştım, ama elbette, bunu yaptığımda her şey iyi çalıştı. İşte benim sınıfları (elided ithalat) şunlardır:

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


} 
Sen de görebileceğiniz

System.err.println ve @DependsOn ek açıklamaları t hakkında bir tür şapka yapıyorum.

  • 208 [Konu-0: Burada kullanışlı bir yöntem olmakla eğer

    Ben tam günlüğünü sağlayabilir Alakalı hatları (biraz biçimlendirme ile) belki (daha okunabilir hale getirmek için) olduğunu düşünüyorum budur ] INFO org.springframework.context.annotation.ConfigurationClassEnhancer

  • Başarıyla geliştirilmiş com.bjk.observation.server.config.DaoConfig; Geliştirilmiş sınıf adıdır: com.bjk.observation.server.config.DaoConfig $$ EnhancerByCGLIB $$ 96e1956
  • 229 [Konu-0] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory
  • Ön başlatmasını singletons org.s[email protected]185572a: fasulyeleri tanımlama [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org. springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.annotation.internalPersistenceAnnotationProcessor, daoConfig, com.bjk.observation.server.config.DataSourceConfig # 0, dataSource, com.bjk.observation.server.config.HibernateConfig # 0, adlandırmaları trategy, sessionFactory, jdbcTemplate, txManager, hibernateTemplate, fenomenGroupDao, fenomenonDao, discretePhenomenonDao]; Fabrika hiyerarşisi DaoConfig kök org.s[email protected]185572a içinde ...
  • 252 [Konu-0] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory
  • yok edilmesi singletons inşa: fasulyeleri tanımlama [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.annotation .internalPersistenceAnnotationProcessor, daoConfig, com.bjk.observation.server.config.DataSourceConfig # 0, dataSource, com.bjk.observation.server.config.HibernateConfig # 0, adlandırmaStrategy, oturumFactory, jdbcTemplate, txManager hibernateTemplate, phenomenonGroupDao, phenomenonDao, discretePhenomenonDao]; fabrika hiyerarşisinin kökü
  • 253 [Konu-0] ERROR org.springframework.web.context.ContextLoader
  • Bağlam başlatma başarısız oldu org.springframework.beans.factory.BeanCreationException: 'daoConfig' adıyla fasulye oluşturulurken hata oluştu: Otomatik kablolu bağımlılıkların enjeksiyonu başarısız oldu; nested exception org.springframework.beans.factory.BeanCreationException: autowire alanı kurulamadı: private com.bjk.observation.server.config.HibernateConfig com.bjk.observation.server.config.DaoConfig.hibernateConfig; nested exception org.springframework.beans.factory.BeanCreationException: 'com.bjk.observation.server.config.HibernateConfig # 0' adıyla fasulye yaratılırken hata oluştu: Çekirdeğin taklit edilmesi başarısız oldu; nested exception org.springframework.beans.BeanInstantiationException: Bean sınıfı [com.bjk.observation.server.config.HibernateConfig] örneğini oluşturamadı: Oluşturucu istisnayı fırlattı; İç içe istisna burada olduğuna inanıyoruz, java.lang.NullPointerException

cevap

2

sorundur:

@Autowired 
private DataSourceConfig dataSourceConfig; 

açıkça diğer @Configuration -annotated sınıfları ile kendinizi tel gerekiyordu, ama daha ziyade fasulye olmadığınızı Üretirler. Bahar senin için sıhhi tesisatını çözecek.

Yani daha basit yukarıda alanını değiştirin:

@Autowired 
private DataSource dataSource; 

Bahar DataSourceConfig den DataSource alıp şeffaf alana enjekte edecek.

Benzer şekilde, birlikte

@Autowired 
private HibernateConfig hibernateConfig; 

yerine

@Autowired 
private HibernateTemplate hibernateTemplate; 
Sen AnnotationSessionFactoryBean gibi fabrika fasulye ile çalışırken sık sık aramak zorunda beri @Configuration tarzı olarak güzel hissetmez fark edersiniz

getObject() kendiniz. Bazen, XML yapılandırması kullanmak ve java config stili ile karıştırmak daha doğaldır.

+3

Bunun neden tam olarak yardımcı olacağını bilmiyorum çünkü @Configuration ile işaretlenmiş sınıfların kendi başlarına fasulye olması gerekiyor. Bununla birlikte, önerdiğiniz gibi denedim ve hata günlüğüm farklı olsa da, yine de doğru sırayla başlatılmamış olan fasulyelerle uğraşmak zorunda. (Hata ayıklayıcı bunu onaylar.) @Configuration ürününün fabrika fasulyeleri kadar hoş olmadığına inanıyorum ve aslında eski güvenilir xml yapılandırmasına geri döndüm, ancak hala nasıl çalıştığını anlamak isterim. – jhericks

İlgili konular