我正在使用Spring Boot应用程序,并且需要基于数据库提供程序来实现条件Bean。问题是,当我尝试使用@Value标记获取属性时,我得到的是空值。
我尝试创建另一个类或使用@ Component / @ Services标记extends Condition
类,但是它也不起作用
@Component
public class PostgreSQLProviderCondition implements Condition{
@Value("${spring.datasource.url}")
private String dbConnectionString;
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return dbConnectionString.contains("postgresql"); //Null pointer exception :c
}
}
我也尝试过使用所有属性创建一个新类,但是当我执行@Autowired
时,我也会得到null。
这是配置类的实现:
@Configuration
public class SQLProviderConfiguration{
@Bean
@Conditional(PostgreSQLProviderCondition.class)
public IFilingNumberSQLProvider filingProviderPostgreSQL() {
return new FilingNumberSQLProviderPostgreSQL();
}
@Bean
@Conditional(SQLServerProviderCondition.class)
public IFilingNumberSQLProvider filingProviderSQLServer() {
return new FilingNumberSQLProviderSQLServer();
}
}
boostrap.yml配置文件如下:
spring:
profiles: offline
cloud:
config:
enabled: false
jmx:
default-domain: ****
datasource:
url: ****
username: ****
password: ****
hikari:
pool-name: *****
jpa:
hibernate.ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
temp.use_jdbc_metadata_defaults: false
default_schema: msa_data
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
generate-ddl: true
答案 0 :(得分:2)
这不能直接回答您的问题,但我相信可以解决基本要求。
您只能使用@ConditionalOnExpression
仅在SpEL有效时应用配置。对于您的情况,您可以:
@ConditionalOnExpression("'${spring.datasource.url}'.contains('postgresql')")