injeção de propriedade primavera-boot não trabalhando em sala de aula @Configuration personalizado

votos
3

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;
    }
}
Publicado 16/11/2013 em 13:57
fonte usuário
Em outras línguas...                            


2 respostas

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

fez o truque.

Respondeu 18/11/2013 em 09:21
fonte usuário

votos
9

Em vez de seu DatabaseConfigadicionar o seguinte application.propertiespara src/main/resources(e, portanto, remover a sua DatabaseConfigclasse)

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

Substitua o <placeholder> com o valor real e primavera-boot vai cuidar do presente.

Dica remover a dependência C3P0 como a Primavera irá fornecer-lhe (padrão) com o pool de conexão tomcat (que é mais recente e mais activly mantido e apesar do nome é perfeitamente utilizável sem / fora Tomcat).

Respondeu 18/11/2013 em 11:33
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more