2015-09-30 55 views
1

Maven依賴(Spring MVC的+ Hibernate的4 +測試4)自動裝配DAO返回NULL

<!-- SPRING MVC --> 
<spring-version>4.0.3.RELEASE</spring-version> 
<spring-test-version>4.2.1.RELEASE</spring-test-version> 
<!-- TESTS --> 
<junit-Version>4.11</junit-Version> 
<!-- DATA BASE --> 
<hibernate.version>4.1.5.Final</hibernate.version> 
<hibernate-validator>4.2.0.Final</hibernate-validator> 
<mysql.connector.version>5.1.32</mysql.connector.version> 

AccountDao.java

@Repository 
@Transactional 
public class AccountDao { 

    private final SessionFactory sessionFactory; 

    @Inject 
    public AccountDao(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 
    [...] 
} 

測試

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {SpringMVCInitializer.class}, loader=AnnotationConfigContextLoader.class) 
public class LoadingTests extends TestMachine { 

    @Autowired 
    private AccountDao accountDao; 

AppConfig.java

@Configuration 
@PropertySource("classpath:application.properties") 
@ComponentScan(basePackages = "company") 
@EnableTransactionManagement 
public class AppConfig { 

     @Bean 
     public AccountDao accountDao() { 
      return new AccountDao(); 
     } 

     @Bean 
     public PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() { 
      return new PropertySourcesPlaceholderConfigurer(); 
     } 

     @Bean 
     public JdbcTemplate jdbcTemplate() { 
      return new JdbcTemplate(dataSource()); 
     } 

     @Bean 
     public DataSource dataSource() { 
      DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

      /*LOCAL*/ 
      dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
      dataSource.setUrl("jdbc:mysql://localhost:3306/compamny"); 
      dataSource.setUsername("root"); 
      dataSource.setPassword(""); 

      return dataSource; 
     } 

     @Bean(name = "sessionFactory") 
     public LocalSessionFactoryBean sessionFactory() { 
      LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
      sessionFactoryBean.setDataSource(dataSource()); 
      sessionFactoryBean.setPackagesToScan("insynctive.model"); 
      sessionFactoryBean.setHibernateProperties(hibProperties()); 
      return sessionFactoryBean; 
     } 

     @Bean 
     public HibernateTransactionManager transactionManager() { 
      HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
      transactionManager.setSessionFactory(sessionFactory().getObject()); 
      return transactionManager; 
     } 

     private Properties hibProperties() { 
      Properties properties = new Properties(); 
      properties.put(Environment.HBM2DDL_AUTO, "create"); 
      properties.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect"); 
      properties.put(Environment.SHOW_SQL, true); 
      return properties; 
     } 

    } 

SpringMVCConfiguration.java

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages="company.controller") 
public class SpringMVCConfiguration extends WebMvcConfigurerAdapter { 

    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolverJSP = new InternalResourceViewResolver(); 
     viewResolverJSP.setOrder(1); 
     viewResolverJSP.setViewClass(JstlView.class); 
     viewResolverJSP.setPrefix("views/jsp/"); 
     viewResolverJSP.setSuffix(".jsp"); 

     return viewResolverJSP; 
    } 
} 

SpringMVCInitializer.java

public class SpringMVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] {AppConfig.class, SpringMVCConfiguration.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
} 

AccountDao的自動裝配Autowired被返回null爲什麼?但在我的web應用程序中一切正常。

我嘗試很多東西,如:

  • 創建一個新的SessionFactory的,但不起作用。
  • 使用:classes = {AppConfig.class,SpringMVCConfig.class}。
  • 使用:@ContextConfiguration(初始化= {SpringMVCInitializer.class},裝載機= AnnotationConfigContextLoader.class)擲類型不匹配:不能從類轉換爲類>
  • 使用:@SpringApplicationConfiguration(類= {SpringMVCInitializer.class})
+0

嗨,你能告訴我們你的問題是什麼嗎? – Stefan

+0

我的autowired的accountDao返回null,爲什麼? –

+0

如果在你的dao中有另一個對象,你應該在你的spring環境中識別它。還檢查道包組件掃描 – jdev

回答

0

我解決了這個問題,使得HibernateUtils創建一個sessionFactory。

0

我認爲你需要在你的LoadingTests類中設置初始化器而不是類。

@ContextConfiguration(initializers = {SpringMVCInitializer.class}, loader=AnnotationConfigContextLoader.class) 

另外請考慮在你的DAO上使用構造函數注入。

+0

多數民衆贊成什麼時候我嘗試這樣做:類型不匹配:不能從類轉換爲類<?擴展ApplicationContextInitializer <?擴展ConfigurableApplicationContext >> –

0

既然你有@Repository你應該在你的配置類包括他們

@EnableJpaRepositories(basePackages="yourrepositories")

+0

這對maven的依賴是什麼? –

+0

\t org.springframework \t 彈簧JPA \t 2.0.8 jpganz18

+0

林不知道是否可以在不使用JPA使用的@entities .... – jpganz18

0

嘗試添加

@WebAppConfiguration 

你測試類之前。

@WebAppConfiguration的上測試類僅僅存在確保了 的WebApplicationContext將加載用於使用默認 路徑到web應用程序的根的試驗。