2011-09-14 34 views
5

我正在使用Spring MVC 3.1.0M2並試圖將我的配置移至java bean。但是,我遇到以下錯誤:Spring 3.1:DataSource未自動裝配到@Configuration類

2011-09-14 18:43:42.301:WARN:/:unavailable org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration#0': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: void org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration.setConfigurers(java.util.Collection); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class ru.mystamps.web.config.DbConfig: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean ru.mystamps.web.config.DbConfig.entityManagerFactory()] threw exception; nested exception is java.lang.IllegalArgumentException: DataSource must not be null

映射從web.xml

<context-param> 
    <param-name>spring.profiles.default</param-name> 
    <param-value>dev</param-value> 
</context-param> 

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
     <param-name>contextClass</param-name> 
     <param-value> 
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
     </param-value> 
    </init-param> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      ru.mystamps.web.config.MvcConfig, 
      ru.mystamps.web.config.DbConfig 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

DbConfig.java

@Configuration 
@EnableTransactionManagement 
@ImportResource("classpath:spring/datasource.xml") 
public class DbConfig { 

    @Autowired 
    private DataSource dataSource; 

    @Bean 
    public JpaVendorAdapter jpaVendorAdapter() { 
     final HibernateJpaVendorAdapter jpaVendorAdapter = 
      new HibernateJpaVendorAdapter(); 

     jpaVendorAdapter.setDatabasePlatform(dialectClassName); 
     jpaVendorAdapter.setShowSql(showSql); 

     return jpaVendorAdapter; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final LocalContainerEntityManagerFactoryBean entityManagerFactory = 
      new LocalContainerEntityManagerFactoryBean(); 

     entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter()); 
     entityManagerFactory.setDataSource(dataSource); 

     final Map<String, String> jpaProperties = new HashMap<String, String>(); 
     jpaProperties.put("hibernate.format_sql", formatSql); 
     jpaProperties.put("hibernate.connection.charset", "UTF-8"); 
     jpaProperties.put("hibernate.hbm2ddl.auto", hbm2ddl); 
     entityManagerFactory.setJpaPropertyMap(jpaProperties); 

     return entityManagerFactory; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     final JpaTransactionManager transactionManager = 
      new JpaTransactionManager(); 

     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 

     return transactionManager; 
    } 

    ... 
} 

spring/datasource.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/jdbc 
    http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd"> 

    <context:property-placeholder location="classpath:spring/database.properties" /> 

    <beans profile="dev"> 
     <bean id="dataSource" 
      class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close"> 
      <property name="driverClassName" value="${db.driverClassName}" /> 
      <property name="url" value="${db.url}" /> 
      <property name="username" value="${db.username}" /> 
      <property name="password" value="${db.password}" /> 
     </bean> 
    </beans> 

    <beans profile="test"> 
     <jdbc:embedded-database id="dataSource" type="HSQL"> 
      <jdbc:script location="classpath:test-data.sql" /> 
     </jdbc:embedded-database> 
    </beans> 

</beans> 

我前在導入datasource.xml之後將會創建這個bean dataSource,但我總是得到這個錯誤。

TIA

+0

也許東西是錯誤的配置文件?你有沒有試過運行它? – axtavt

+0

@axtavt當我刪除配置文件,並保留'dataSource'與'jdbc:embedded-database'我有同樣的錯誤。 –

回答

3

我發現錯誤的原因,當我手動定義只出現PersistenceAnnotationBeanPostProcessor

@Bean 
    public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() { 
      // enable injection of EntityManager to beans with @PersistenceContext annotation 
      return new PersistenceAnnotationBeanPostProcessor(); 
    } 

我很抱歉,因爲我沒有發佈完整的代碼在我的問題(因爲我認爲,這個Bean不物)。當我刪除這個定義時,所有的工作如預期。此外,我發現,在我的情況下,該豆已註冊:

Note: A default PersistenceAnnotationBeanPostProcessor will be registered by the "context:annotation-config" and "context:component-scan" XML tags. Remove or turn off the default annotation configuration there if you intend to specify a custom PersistenceAnnotationBeanPostProcessor bean definition.

(從org.springframework.orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java報價評論)

0

我知道這並不能回答這個問題,實際卻爲什麼不定義使用註釋以及數據源的?我有一個非常類似的設置工作,不使用XML,但沒有嘗試將這兩種方法結合起來。

+0

我試過了 - 靜態內部類和單獨的類 - 沒有成功,仍然是同樣的錯誤。 (如果它不是答案,那麼爲什麼不把它作爲註釋發佈呢:)) –

+0

你可以發佈你的嘗試在Java代碼中配置數據源嗎? –

+0

看到那裏:http://pastebin.ubuntu.com/689938/我也嘗試使用分離的類沒有運氣。當它工作的時候有一點 - 當我在DbConfig類中定義一個'DataSource'時(沒有配置文件和任何類)。 –