2011-09-14 26 views
5

Tôi đang sử dụng Spring MVC 3.1.0M2 và cố gắng di chuyển các cấu hình của mình sang các hạt java. Nhưng tôi gặp phải lỗi sau:Mùa xuân 3.1: DataSource không được tự động chuyển sang lớp @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

Mapping từ 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> 

tôi cũ pect rằng bean dataSource sẽ được tạo sau khi nhập datasource.xml nhưng tôi luôn gặp phải lỗi này.

TIA

+0

Có lẽ cái gì là sai với hồ sơ? Bạn đã thử chạy nó mà không có chúng? – axtavt

+0

@axtavt khi tôi xóa hồ sơ và chỉ để lại 'dataSource' với' jdbc: embedded-database' Tôi gặp lỗi tương tự. –

Trả lời

3

tôi đã tìm thấy nguyên nhân gây ra lỗi, nó chỉ xảy ra khi tôi tự xác định PersistenceAnnotationBeanPostProcessor:

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

Tôi xin lỗi vì tôi không gửi mã đầy đủ trong câu hỏi của tôi (vì tôi cho rằng đậu này không vấn đề). Khi tôi loại bỏ định nghĩa này tất cả các công trình như mong đợi. Ngoài ra tôi thấy rằng trong trường hợp của tôi đậu này đã đăng ký:

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.

(quote bình luận từ org.springframework.orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java)

0

Tôi biết điều này không trả lời câu hỏi thực tế nhưng tại sao không xác định datasources sử dụng chú thích không? Tôi đã có một thiết lập rất giống nhau làm việc bằng cách sử dụng không có XML nhưng đã không cố gắng kết hợp hai phương pháp tiếp cận.

+0

Tôi đã thử nó - với các lớp bên trong tĩnh và với các lớp riêng biệt - không thành công, vẫn là lỗi tương tự. (Nếu nó không phải là một câu trả lời, vậy tại sao không đăng nó như bình luận? :)) –

+0

Bạn có thể đăng nỗ lực của mình vào việc định cấu hình các nguồn dữ liệu trong mã Java không? –

+0

Xem ở đó: http://pastebin.ubuntu.com/689938/ Tôi cũng đã thử sử dụng các lớp riêng biệt mà không có may mắn. Một điểm khi nó hoạt động - khi tôi chỉ định nghĩa một 'DataSource' bên trong lớp' DbConfig' (không có cấu hình và bất kỳ lớp nào). –

Các vấn đề liên quan