【发布时间】:2013-11-16 12:57:53
【问题描述】:
我想创建一个 DatabaseConfig 类来设置与我的数据库相关的东西(EntityManager、DataSource、TransactionManager)并获取我在String 字段上使用@Value("${property.name}") 的属性
喜欢
@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); 中引用的类),则值注入有效
简而言之,@Value 在我的 Application 类中有效,但在我的自定义 @Configuration 类中无效:(
可能出了什么问题?还是需要更多信息?
更新:更多代码
方式 1,我的 Application.java 中的 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(我想要的),无论我在哪里拥有 PropertySourcesPlaceholderConfigurer(应用程序或数据库配置),它自己的文件(DatabaseConfing.java)中的 DB Stuff 都不起作用,因为它总是在 @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;
}
}
【问题讨论】:
-
不完全是重复的,但我希望接受的解决方案适合您:stackoverflow.com/questions/17097521/…
-
查看您的容器文件(应用程序的上下文),
@Value被处理为某种容器范围,您必须将<context:property-placeholder location="classpath:the-path-to-your-property-file" />添加到您的上下文文件中 -
我已经尝试使用 PropertySourcesPlaceholderConfigurer,但是占位符是在我的数据库内容的 bean 之后执行的,无论如何。无论代码的位置如何(数据库或应用程序类)
-
请发布您的其余配置,包括
PropertySourcesPlaceholderConfiguere。 -
我刚刚添加了更多代码。
标签: java spring spring-boot