@条件获取属性值的问题

时间:2019-07-08 13:44:17

标签: java spring spring-boot

我正在使用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

1 个答案:

答案 0 :(得分:2)

这不能直接回答您的问题,但我相信可以解决基本要求。

您只能使用@ConditionalOnExpression仅在SpEL有效时应用配置。对于您的情况,您可以:

@ConditionalOnExpression("'${spring.datasource.url}'.contains('postgresql')")