Spring 引导自动重新配置在 spring-boot-data-starter-jdbc 上不起作用
Spring Boot auto reconfiguration not working on spring-boot-data-starter-jdbc
我正在尝试将 spring 引导应用程序部署到连接 Postgres 支持服务的 CF。我可以看到数据库属性在 运行 时间内没有被 VCAP env 替换。
我正在使用依赖项 - spring-boot-starter-jdbc(不是 spring-boot-starter-data-jpa 因为我打算使用 JDBC 模板而不是 JPA ).
步骤
在 pom.xml 中添加了以下 jar(spring-boot-starter-data-jpa,postgresql- 驱动程序)
<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 上的本地主机,但失败了。
我查看了所有文档,它们似乎适用于 spring-boot-starter-data-jpa 但不适用于 jdbc。我可以看到自动重新配置在 JDBC 情况下不起作用。
感谢任何帮助。
感谢和问候,
薇拉
我强烈建议您避免使用自动重新配置。演示很酷,但最终很难真正使用。它有点太神奇了,当它不起作用时很难调试,这就是你运行到这里的原因。
还有其他几种方法可以做到这一点:
- Spring 引导将
VCAP_SERVICES
公开为类似于 vcap.services.<name>.credentials.username
的属性。您可以使用它们来手动定义数据源。参见 here。将其与 "cloud" 配置文件相结合,可以轻松地在本地和云端之间切换。
- 你可以use Spring Cloud Connectors。当您使用 SCC 时,自动重新配置将自动退出。然后,您可以使用 SCC 来挑选服务并从中获取数据源。
- 您可以使用新的 java-cfenv library, which is intended to complement Spring Boot better。
我正在尝试将 spring 引导应用程序部署到连接 Postgres 支持服务的 CF。我可以看到数据库属性在 运行 时间内没有被 VCAP env 替换。 我正在使用依赖项 - spring-boot-starter-jdbc(不是 spring-boot-starter-data-jpa 因为我打算使用 JDBC 模板而不是 JPA ).
步骤
在 pom.xml 中添加了以下 jar(spring-boot-starter-data-jpa,postgresql- 驱动程序)
<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 上的本地主机,但失败了。
我查看了所有文档,它们似乎适用于 spring-boot-starter-data-jpa 但不适用于 jdbc。我可以看到自动重新配置在 JDBC 情况下不起作用。
感谢任何帮助。
感谢和问候, 薇拉
我强烈建议您避免使用自动重新配置。演示很酷,但最终很难真正使用。它有点太神奇了,当它不起作用时很难调试,这就是你运行到这里的原因。
还有其他几种方法可以做到这一点:
- Spring 引导将
VCAP_SERVICES
公开为类似于vcap.services.<name>.credentials.username
的属性。您可以使用它们来手动定义数据源。参见 here。将其与 "cloud" 配置文件相结合,可以轻松地在本地和云端之间切换。 - 你可以use Spring Cloud Connectors。当您使用 SCC 时,自动重新配置将自动退出。然后,您可以使用 SCC 来挑选服务并从中获取数据源。
- 您可以使用新的 java-cfenv library, which is intended to complement Spring Boot better。