Eu queria fazer uma classe DatabaseConfig de configurar meu banco de dados material relacionado (EntityManager, DataSource, TransactionManager) e para obter as propriedades que eu uso @Value(${property.name})em Stringcampos
gostar
@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
}
O problema é que todas essas seqüências são NULL em vez dos valores do meu arquivo de propriedades.
se eu colocar o código na minha Applicationclasse (aquele que tem o maine é refernced em SpringApplication.run(Application.class, args);) as obras de injeção de valor
Em suma, @value funciona na minha classe de aplicativos, mas não em minhas aulas @Configuration costume :(
Alguém tem uma idéia do que pode estar errado? Ou mais inforamtions necessário?
desde já, obrigado
ATUALIZAÇÃO : Mais código
Way 1, DB Config e @value na minha Application.java trabalha com e sem a 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 (o que eu quero ter), DB material em seu próprio arquivo (DatabaseConfing.java) não funciona regardles de onde eu tenho o PropertySourcesPlaceholderConfigurer(Aplicação ou DatabaseConfig), uma vez que é sempre chamado após o @Beans dentro do 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;
}
}













