Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用

Posted

技术标签:

【中文标题】Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用【英文标题】:Spring Boot auto reconfiguration not working on spring-boot-data-starter-jdbc 【发布时间】:2019-10-27 11:48:21 【问题描述】:

我正在尝试将 Spring Boot 应用程序部署到连接 Postgres 支持服务的 CF。我可以看到 db 属性在运行时没有被 VCAP env 替换。 我正在使用依赖项 - spring-boot-starter-jdbc(不是 spring-boot-starter-data-jpa,因为我打算使用 JDBC 模板而不是 JPA)。

步骤

在 pom.xml 中添加了以下 jars(spring-boot-starter-data-jpa,postgresql-driver)

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>

创建一个返回类型 DataSource 的 bean

@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource() 
    @SuppressWarnings("rawtypes")
    DataSourceBuilder builder = DataSourceBuilder.create();
    return builder.build();

在 application.properties 中指定连接属性。

spring.datasource.jdbcUrl=jdbc:postgresql://localhost:5432/test
spring.datasource.username= dummy
spring.datasource.password=dummy
spring.datasource.platform=postgresql

有了这个本地设置工作正常。当应用程序部署到 Cloud Foundry 时,期望 spring 自动重新配置应该用 vcap 中的属性替换 bean。 但是这些值似乎没有被替换,系统尝试连接到 CF 上的 localhost 失败。

我查看了所有文档,它们似乎适用于 spring-boot-starter-data-jpa,但不适用于 jdbc。我可以看到在 JDBC 情况下自动重新配置不起作用。

感谢任何帮助。

感谢和问候, 维拉

【问题讨论】:

属性spring.datasource.url不是这个吗? 我也尝试过 spring.datasource.url 但没有成功。 【参考方案1】:

我强烈建议您避免使用自动重新配置。演示很酷,但最终很难认真使用。这有点太神奇了,当它不起作用时很难调试,这就是你在这里遇到的。

还有其他几种方法可以做到这一点:

Spring Boot 将VCAP_SERVICES 公开为类似于vcap.services.&lt;name&gt;.credentials.username 的属性。您可以使用它们手动定义数据源。见here。将此与“云”配置文件相结合,可以轻松在本地和云之间切换。 您可以use Spring Cloud Connectors。当您使用 SCC 时,自动重新配置将自动退出。然后,您可以使用 SCC 挑选服务并从中获取数据源。 您可以使用新的java-cfenv 库,即intended to complement Spring Boot better。

【讨论】:

另请参阅此处对您的问题的评论:github.com/cloudfoundry/java-buildpack-auto-reconfiguration/…。通过属性混合 Spring Boot 自动配置和 Java Buildpack 自动重新配置不会达到你想要的效果。 @Daniel:感谢您的回答。我考虑过使用 spring 云连接器,但我想在本地测试和云测试方面保持简单的实现。现有实现 代码中不存在数据源 bean。维护 application.properties(jdbc url, user, password) 中的 db 参数在本地运行良好。在 Cloud Foundry 中运行时,自动重新配置会自动覆盖该属性,并且与云数据库的连接正常工作。 使用 Spring 云连接器,我相信我需要创建一个数据源 bean。如何使用 db (url,user,password) 的属性来实例化数据库连接?我如何确保代码在本地和云上运行而无需检查 mode==cloud 或 mode==local 之类的代码? @Veeraraghavan 您正在寻找的是个人资料:docs.spring.io/spring-boot/docs/current/reference/html/…。推荐的方法是直接在“本地”配置文件中设置 spring.datasource... 属性,并包含 Daniel 上面提到的 java-cfenv 库,以便在 CF 上运行时自动设置这些属性。

以上是关于Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular、spring-boot、maven 项目中配置项目以自动重新加载浏览器

Spring Boot框架的搭建

关于 Spring Boot 自动装配你知道多少?

运行 Spring Boot 应用程序时如何显示自动配置报告

Spring Boot学习笔记——Spring Boot与ActiveMQ的集成

Spring Boot JPA 连接验证不起作用