2011-09-14 8 views
5

Używam Spring MVC 3.1.0M2 i próbuję przenieść moje konfiguracje do komponentów bean Java. Ale napotkać następujący błąd:Wiosna 3.1: Źródło danych nie zostało automatycznie uwierzytelnione w klasie @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

odwzorowanie 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> 

I ex Pect, że fasola dataSource zostanie utworzona po zaimportowaniu datasource.xml, ale zawsze mam ten błąd.

TIA

+0

Być może coś jest nie tak z profili? Czy próbowałeś go uruchomić bez nich? – axtavt

+0

@axtavt po usunięciu profili i pozostawienie tylko 'dataSource' z' jdbc: embedded-database' Mam ten sam błąd. –

Odpowiedz

3

Znalazłem przyczynę błędu, to występuje tylko wtedy, gdy ręcznie zdefiniować PersistenceAnnotationBeanPostProcessor:

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

mi przykro, bo nie napisali pełny kod na moje pytanie (bo przypuszczał, że to nie fasola materia). Po usunięciu tej definicji wszystkie działają zgodnie z oczekiwaniami. Znalazłem również, że w moim przypadku to fasola już zarejestrowany (komentarz cytat z org.springframework.orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java)

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.

0

wiem, że to nie jest odpowiedź na rzeczywiste pytanie ale dlaczego nie określenie źródeł danych za pomocą adnotacji, jak również? Mam bardzo podobną konfigurację działającą bez użycia XML, ale nie próbowałem połączyć tych dwóch podejść.

+0

Próbowałem - z klasami wewnętrznymi statycznymi iz oddzielnymi klasami - bez powodzenia, wciąż ten sam błąd. (Jeśli to nie jest odpowiedź, dlaczego więc nie zamieścić go jako komentarz?)) –

+0

Czy możesz wysłać próbę konfiguracji źródeł danych w kodzie Java? –

+0

Zobacz tam: http://pastebin.ubuntu.com/689938/ Próbowałem również używać oddzielnych klas bez powodzenia. Jeden punkt, kiedy to działa - kiedy definiuję tylko jedno 'DataSource' w klasie' DbConfig' (bez profili i żadnych klas). –

Powiązane problemy