当前位置: 首页 > 知识库问答 >
问题:

仅在需要时启用R2DBC配置

嵇俊德
2023-03-14

我正在开发一个被其他项目使用的库。该库通过JDBC提供数据库访问,我想在同一个库中也添加对R2DBC的支持。使用项目应该能够根据配置属性在JDBC和R2DBC之间切换。

我面临的问题是spring-boot-starter-data-r2dbc(2.5.4)提供的R2DBC自动配置覆盖了JDBC配置,并且使用的项目只能使用R2DBC。

此外,在构建项目时,有些任务,如留档或代码生成、测试等,取决于正在加载的Spring上下文,但不需要数据库访问。这些任务失败是因为由于缺少R2DBC属性而无法加载上下文:

BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations$Pool.class]: Bean instantiation via factory method failed;
 nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.r2dbc.pool.ConnectionPool]: Factory method 'connectionFactory' threw exception; 
 nested exception is org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsInitializer$ConnectionFactoryBeanCreationException: Failed to determine a suitable R2DBC Connection URL

当然,我可以指定所需的属性,但加载我不使用的组件是不对的。我想完全禁用R2DBC(就像您可以使用spring.cloud.Vault.enabled=false禁用Vault支持一样),并且只在需要时加载它。有什么办法吗?

共有1个答案

邵弘致
2023-03-14

我的第一次尝试是在库中创建配置类:

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "r2dbc.enabled", havingValue = "false", matchIfMissing = true)
@AutoConfigureBefore(R2dbcAutoConfiguration.class)
@EnableAutoConfiguration(exclude = R2dbcAutoConfiguration.class)
public class R2dbcConfig {}

这对一些任务起了作用,但在其他任务中引起了问题。我把它贴出来,因为它可能对一些人来说已经足够了。

在我的所有案例中有效的解决方案都有点复杂,我必须实现一个添加org.springframework.boot.autoconfigure.r2dbc的环境后处理器(EnvironmentPostProcessor)。R2dbcAutoConfiguration到spring.autoconfigure。排除属性。简而言之,是这样的:

public class R2dbcDisablerEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Properties props = new Properties();
        props.setProperty("spring.autoconfigure.exclude", "org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration");

        environment.getPropertySources()
                .addLast(new PropertiesPropertySource("r2dbcProperties", props));
    }
}

谢谢@xerx593的指点!

 类似资料:
  • 问题内容: 我将Require.js与Angular.js结合使用。 一些控制器需要巨大的外部依赖关系,而其他控制器则不需要,例如,需要Angular UI Codemirror 。这至少是135 kb,至少: 我不想每次我的页面加载时都只包含指令和Codemirror lib只是为了使Angular开心。 这就是为什么我现在仅在遇到路线时才加载控制器,就像这里所做的那样。 但是,当我需要类似的东

  • 我有一个pip的包文件(dependencies.conf),其中包括我的应用程序需要的一系列包: 在构建过程中,我使用以下方式下载所有软件包: 然后在部署过程中,我想安装这些文件,只有当安装的版本不同于我需要的,并且顺序正确(依赖关系) 我目前正在使用以下工具: 但是这是错误的,因为它没有验证版本(如果需要,我是为了降级包),并且它没有处理正确的依赖顺序。 有没有简单的方法可以做到这一点?(我基

  • 我有一个Android应用程序。在启动屏幕的方法中,我添加了 因此,我希望在onCreate退出后100ms后执行该代码。 但我可以看到,我的应用程序在onCreate()之后花了3秒时间来执行延迟后的代码(在3秒之后还会出现UI): 有人能告诉我为什么一个应用程序可以在onCreate()之后花3秒来执行延迟后的代码和UI开始出现? 请建议我如何优化这一次的技巧? 还有一个问题,Handler.

  • 问题内容: 我用双精度(小数)出现了这个问题。 当double = 1.234567时,我使用 所以结果是1.234 但是当我的倍数是10时 ,结果将是10,000, 我希望这是10 他们是否可以说他只在“ usefull”时才显示小数? 我看到了一些有关此的文章,但是那是php或c#,找不到关于android / java的东西(也许我看起来不太好)。 希望你们能帮我这个忙。 编辑,现在我使用类

  • 我有一个API,它返回一个限制为100个实体的实体列表。如果有更多实体,它将为下一页返回一个标记。 我想创建一个返回所有实体(所有页面)的通量,但仅在需要时(如果要求)。 我编写了以下代码: 而且几乎成功了 如果我请求99个元素,则加载第一页,我的流量包含99个元素。 如果我请求150个元素,则加载第一页和第二页,并且我的流量包含150个元素。 但是,如果我请求100个元素,则会加载第一页和第二页

  • 嘿,我刚刚在我的跨度之一中添加了以下代码: 这工作得不错。唯一的问题是滚动条总是出现,即使你不能点击它。如果它处于非活动状态,没有办法隐藏它吗? 谢谢