【发布时间】:2022-01-25 22:37:50
【问题描述】:
所以,我需要按条件对 DataSource 进行初始化。我从 .env 文件中获取所有 db-config 数据,其中有一个特殊变量 spring_profiles_active。当此变量等于“p2”时,我需要初始化 secondDataSource,否则不需要。我该怎么做呢?
我的配置:
@Configuration
public class JpaConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Value("${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Value("${second.jdbc.url}")
private String secondJdbcUrl;
@Value("${second.jdbc.username}")
private String secondJdbcUsername;
@Value("${second.jdbc.password}")
private String secondJdbcPassword;
@Value("${second.jdbc.driverClassName}")
private String secondJdbcDriverClassName;
@Bean
@Primary
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(jdbcDriverClassName);
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(jdbcUsername);
dataSource.setPassword(EncryptionUtil.decryptProperty(jdbcPassword));
return dataSource;
}
@Bean
@Qualifier("secondDataSource")
public DataSource secondDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(secondJdbcDriverClassName);
dataSource.setUrl(secondJdbcUrl);
dataSource.setUsername(secondJdbcUsername);
dataSource.setPassword(EncryptionUtil.decryptProperty(secondJdbcPassword));
return dataSource;
}
@Bean
@Primary
public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource()); }
@Bean
@Qualifier("secondJdbcTemplate")
public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource") DataSource secondDataSource) {
return new JdbcTemplate(secondDataSource);
}
}
-
更新:
我尝试使用@Condition 注释来执行此操作,但在
return activeProfile.equals("p2")中出现异常 java.lang.NullPointerException: null。代码:
@Configuration
@Conditional(SecondJpaConfigCondition.class)
public class SecondJpaConfig {
@Value("${second.jdbc.url}")
private String secondJdbcUrl;
@Value("${second.jdbc.username}")
private String secondJdbcUsername;
@Value("${second.jdbc.password}")
private String secondJdbcPassword;
@Value("${second.jdbc.driverClassName}")
private String secondJdbcDriverClassName;
@Bean
@Qualifier("secondDataSource")
public DataSource secondDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(secondJdbcDriverClassName);
dataSource.setUrl(secondJdbcUrl);
dataSource.setUsername(secondJdbcUsername);
dataSource.setPassword(EncryptionUtil.decryptProperty(secondJdbcPassword));
return dataSource;
}
@Bean
@Qualifier("secondJdbcTemplate")
public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource") DataSource secondDataSource) {
return new JdbcTemplate(secondDataSource);
}
}
@Component
public class SecondJpaConfigCondition implements Condition {
@Value("${spring.profiles.active}")
private String activeProfile;
@Override
public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
return activeProfile.equals("p2");
}
}
【问题讨论】:
标签: spring spring-boot spring-data-jpa