(Spring MVC + Hibernate 4 + Test 4) 自动装配 DAO return NULL

(Spring MVC + Hibernate 4 + Test 4) autowired DAO return NULL

Maven 依赖项

<!-- 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 自动连接返回 null 为什么? 但在我的网络应用程序中一切效果不错。

我尝试了很多事情,例如:

我认为您需要在 LoadingTests class.

上设置初始值设定项而不是 classes
@ContextConfiguration(initializers = {SpringMVCInitializer.class}, loader=AnnotationConfigContextLoader.class)

另外请考虑在您的 DAO 上使用构造函数注入。

既然你有 @Repository 你应该把它们包括在

@EnableJpaRepositories(basePackages="yourrepositories") 在您的配置 class

尝试添加

@WebAppConfiguration 

在测试之前 class。

The mere presence of @WebAppConfiguration on a test class ensures that a WebApplicationContext will be loaded for the test using a default for the path to the root of the web application.

我通过使用 HibernateUtils 来创建 sessionFactory 解决了这个问题。