我想制作一个DatabaseConfig类来设置与数据库相关的东西(EntityManager,DataSource,TransactionManager)并获取我@Value("${property.name}")在String字段上使用的属性
@Value("${property.name}")
String
喜欢
@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和中引用的代码SpringApplication.run(Application.class, args);),则值注入有效
Application
main
SpringApplication.run(Application.class, args);
简而言之,@Value在我的Application类中有效,但在我的自定义@Configuration类中无效:(
有什么事吗 还是需要更多信息?
更新 :更多代码
我的Application.java中的方式1,DB Config和@Value使用和不使用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); } }
方法2(我想要的),在自己的文件(DatabaseConfing.java)中的DB Stuff不适用于我拥有PropertySourcesPlaceholderConfigurer(Application或DatabaseConfig)的位置,因为它总是在DatabaseConfig内部@Beans之后被称为:(
PropertySourcesPlaceholderConfigurer
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; } }
而不是DatabaseConfig将以下内容添加application.properties到src/main/resources(从而删除您的DatabaseConfig类)
DatabaseConfig
application.properties
src/main/resources
#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>
将 < placeholder>替换为实际值,并且spring-boot会解决这个问题。
提示删除C3P0依赖项,因为Spring将为您(默认)提供tomcat连接池(这是更新的,并且更加活跃地维护,尽管该名称在Tomcat外部/外部完全可用)。