spring-boot属性注入在自定义@Configuration类中不起作用

我想制作一个DatabaseConfig类来设置与数据库相关的东西(EntityManager,DataSource,TransactionManager)并获取我@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);),则值注入有效

简而言之,@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之后被称为:(

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.propertiessrc/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>

将 替换为实际值,并且spring-boot会解决这个问题。

提示删除C3P0依赖项,因为Spring将为您(默认)提供tomcat连接池(这是更新的,并且更加活跃地维护,尽管该名称在Tomcat外部/外部完全可用)。

以上是 spring-boot属性注入在自定义@Configuration类中不起作用 的全部内容, 来源链接: utcz.com/qa/421146.html

回到顶部