2013-11-16 2 views
3

я хотел сделать класс DatabaseConfig настроить свою базу данных связанных вещи (EntityManager, DataSource, TransactionManager) и получить свойства, которые я использую @Value("${property.name}") на String поляхвесны-ботинки инъекция свойства не работает в пользовательском классе @Configuration

например

@Configuration 
public class DataBaseConfig { 
    @Value("${hibernate.connection.username}") 
    private String hibernateConnectionUsername; 
    @Value("${hibernate.connection.password}") 
    private String hibernateConnectionPassword; 
    @Value("${hibernate.connection.driver_class}") 
    private String hibernateConnectionDriverClass; 
    @Value("${hibernate.connection.url}") 
    private String hibernateConnectionUrl; 
    @Value("${hibernate.dialect}") 
    private String hibernateDialect; 
    @Value("${hibernate.showSql}") 
    private String hibernateShowSql; 
    @Value("${hibernate.generateDdl}") 
    private String hibernateGenerateDdl; 

// All my @Beans 
} 

Проблема в том, что все эти строки имеют значение NULL вместо значений моего файла свойств.

если я поставил код в мой Application класс (тот, который имеет main и refernced в SpringApplication.run(Application.class, args);) инъекции значение работы

Короче говоря, @value работает в моем классе приложений, но не в моем обычае @Configuration классы :(

Каждый получил представление о том, что может быть не так? Или больше inforamtions нужен?

заранее спасибо

UPDATE: Подробнее Код

Way 1, DB Config и @value в моем Application.java работает и без PropertySourcesPlaceholderConfigurer

import java.beans.PropertyVetoException; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 

import com.mchange.v2.c3p0.ComboPooledDataSource; 

@Configuration 
@ComponentScan 
@EnableJpaRepositories 
@EnableAutoConfiguration(exclude = HibernateJpaAutoConfiguration.class) 
public class Application { 
    public static void main(String[] args) throws Throwable { 
     SpringApplication.run(Application.class, args); 
    } 

    // @Bean 
    // public static PropertySourcesPlaceholderConfigurer properties() { 
    // PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); 
    // pspc.setLocations(new Resource[] { new ClassPathResource("application.properties") }); 
    // return pspc; 
    // } 

    /*****************************/ 
    @Value("${hibernate.connection.username}") 
    private String hibernateConnectionUsername; 

    @Value("${hibernate.connection.password}") 
    private String hibernateConnectionPassword; 

    @Value("${hibernate.connection.driver_class}") 
    private String hibernateConnectionDriverClass; 

    @Value("${hibernate.connection.url}") 
    private String hibernateConnectionUrl; 

    @Value("${hibernate.dialect}") 
    private String hibernateDialect; 
    @Value("${hibernate.showSql}") 
    private String hibernateShowSql; 
    @Value("${hibernate.generateDdl}") 
    private String hibernateGenerateDdl; 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setDatabasePlatform(hibernateDialect); 
     boolean generateDdl = Boolean.parseBoolean(hibernateGenerateDdl); 
     boolean showSql = Boolean.parseBoolean(hibernateShowSql); 
     vendorAdapter.setGenerateDdl(generateDdl); 
     vendorAdapter.setShowSql(showSql); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setDataSource(dataSource()); 
     factory.setPackagesToScan("xxx"); 

     return factory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     dataSource.setUser(hibernateConnectionUsername); 
     dataSource.setPassword(hibernateConnectionPassword); 
     try { 
      dataSource.setDriverClass(hibernateConnectionDriverClass); 
     } catch (PropertyVetoException e) { 
      throw new IllegalArgumentException("Wrong driver class"); 
     } 

     dataSource.setJdbcUrl(hibernateConnectionUrl); 
     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
     return new JpaTransactionManager(entityManagerFactory); 
    } 
} 

Way 2 (то, что я хочу иметь), DB Материал в его собственный файл (DatabaseConfing.java) не работает regardles о том, где я есть PropertySourcesPlaceholderConfigurer (Application или DatabaseConfig), как это всегда называется ПОСЛЕ @Beans внутри DatabaseConfig :(

import java.beans.PropertyVetoException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 
import org.springframework.core.type.filter.AnnotationTypeFilter; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 

import com.mchange.v2.c3p0.ComboPooledDataSource; 


@Configuration 
public class DatabaseConfig { 
    @Value("${hibernate.connection.username}") 
    private String hibernateConnectionUsername; 
    @Value("${hibernate.connection.password}") 
    private String hibernateConnectionPassword; 
    @Value("${hibernate.connection.driver_class}") 
    private String hibernateConnectionDriverClass; 
    @Value("${hibernate.connection.url}") 
    private String hibernateConnectionUrl; 
    @Value("${hibernate.dialect") 
    private String hibernateDialect; 
    @Value("${hibernate.showSql}") 
    private String hibernateShowSql; 
    @Value("${hibernate.generateDdl}") 
    private String hibernateGenerateDdl; 

     // @Bean 
     // public static PropertySourcesPlaceholderConfigurer properties() { 
     // PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); 
     // pspc.setLocations(new Resource[] { new ClassPathResource("application.properties") }); 
     // return pspc; 
     // } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setDatabasePlatform(hibernateDialect); 
     boolean generateDdl = Boolean.parseBoolean(hibernateGenerateDdl); 
     boolean showSql = Boolean.parseBoolean(hibernateShowSql); 
     vendorAdapter.setGenerateDdl(generateDdl); 
     vendorAdapter.setShowSql(showSql); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setDataSource(dataSource()); 
     factory.setPackagesToScan("xxx"); 

     return factory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     dataSource.setUser(hibernateConnectionUsername); 
     dataSource.setPassword(hibernateConnectionPassword); 
     try { 
      dataSource.setDriverClass(hibernateConnectionDriverClass); 
     } catch (PropertyVetoException e) { 
      throw new IllegalArgumentException("Wrong driver class"); 
     } 
     System.err.println(hibernateConnectionUrl); 
     dataSource.setJdbcUrl(hibernateConnectionUrl); 
     return dataSource; 
    } 
} 
+0

Не совсем дубликат, но я ожидаю, что принятое решение будет работать для вас: http://stackoverflow.com/questions/17097521/spring-3-2-value-annotation-with-pure-java-configuration- do-not-work-but-env – Ralph

+0

Посмотрите на файлы вашего контейнера (контекст вашего приложения), '@ Value' обрабатывается только для того, чтобы быть каким-то контейнером, вам нужно добавить' 'в ваш контекстный файл –

+0

Я уже пытался использовать PropertySourcesPlaceholderConfigurer, но заполнитель был выполнен после моих бобин для материала базы данных, независимо. независимо от местоположения кода (db или класса приложения) – Dodge

ответ

9

Вместо того, чтобы ваш DatabaseConfig добавить следующее application.properties к src/main/resources (и, таким образом удалить DatabaseConfig класс)

#DataSource configuration 
spring.datasource.driverClassName=<hibernateConnectionDriverClass> 
spring.datasource.url=<hibernateConnectionUrl> 
spring.datasource.username=<hibernateConnectionUsername> 
spring.datasource.password=<hibernateConnectionPassword> 

#JPA/HIbernate 
spring.jpa.database-platform=<dialect-class> 
spring.jpa.generate-ddl=<hibernateGenerateDdl> 
spring.jpa.show-sql=<hibernateShowSql> 

Заменить < заполнитель> с фактическим значением и пружинным ботинком позаботится об этом.

Совет отключает зависимость C3P0, поскольку Spring предоставит вам (по умолчанию) пул соединений tomcat (который является более новым и более активно поддерживается и, несмотря на то, что имя прекрасно доступно без/вне Tomcat).

+0

Являются ли это свойствами для hibernate jpa autoconfigurer? – Dodge

+0

Свойства 'spring.jpa', остальные - основные весенние свойства jdbc (они также работают в простой среде jdbc). –

+0

приятно, это работает, но, похоже, есть другая стратегия именования, настроенная весной. в то время как мои старые столы, где на верблюдах, как и у моих существ, теперь они строчные и разделенные «HelloWorldEntity» -> «hello_world_entity», я думаю, что мне все равно, поскольку проект довольно новый, и я не вижу причин принуждать другого стратегия именования – Dodge

1
@Import({ CacheConfig.class, DatabaseConfig.class }) 
@ComponentScan(excludeFilters = @Filter(Configuration.class)) 

сделал трюк.

+0

Где вы добавляете этот код? У меня такая же проблема с созданным мной файлом CacheConfig. –

+0

Я добавил это в класс приложения – Dodge

+0

. Я столкнулся с той же проблемой. Исключение конфигурации из ComponentScan, похоже, решает проблему неинъекции @value в каком-то файле конфигурации. –

Смежные вопросы