小编Ger*_*uer的帖子

Spring Boot:以数据库类型为条件

我有一个 Spring Boot 应用程序,想根据底层 SQL 数据源的类型(使用 spring.datasource.* 属性定义)注入特定的存储库实现。

我在这里尝试使用自定义条件,但不幸的是,在评估它时,我无法获取数据源以检查数据库类型。

我目前的情况是这样的:

@Order(Ordered.LOWEST_PRECEDENCE - 10)
class OnDatabaseTypeCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        DataSource dataSource = context.getBeanFactory().getBean(DataSource.class);
        // further matching code here

}
Run Code Online (Sandbox Code Playgroud)

它应该像这样使用:

@ConditionalOnDatabaseType(H2)
public class MyCustomImplementation implements MyRepository {
    // Code
}
Run Code Online (Sandbox Code Playgroud)

但是,当评估条件时,我得到一个未定义数据源的异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:348)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:335)
Run Code Online (Sandbox Code Playgroud)

我认为这是因为在构建所有 bean 之前已经检查了条件。有什么方法可以告诉 Spring 在评估此条件之前必须创建数据源吗?或者这是不可能使用Spring条件?

我想解决的用例如下:应用程序可以运行不同类型的数据库,有些(如 H2)没有某些功能,如窗口函数。所以我想为某些可能较慢但功能上仍然正确的数据库提供特殊查询。这种方法的想法是,这些 JDBC 存储库应该很容易标记,而无需引入特定的 Spring 配置文件,而只需查看底层数据库(使用 org.springframework.jdbc.support.JdbcUtils)。

谢谢

java spring spring-boot

5
推荐指数
1
解决办法
2101
查看次数

标签 统计

java ×1

spring ×1

spring-boot ×1