数据源对象被 Cloud Foundry 配置覆盖
Datasource object is overridden with cloud foundry configurations
我有一个 spring 引导应用程序绑定到 cloud foundry 环境中的数据库服务实例 (postgres)。
应用程序的 VCAP 包括以下绑定:
"postgresql": [
{
"binding_name": null,
"credentials": {
"dbname": "yD6nAoGVmfmqnbex",
"end_points": [
{
"host": "10.11.241.0",
"network_id": "SF",
"port": "50257"
}
],
"hostname": "10.11.241.0",
"password": "No963ndbbsfndJoj",
"port": "50257",
"ports": {
"5432/tcp": "50257"
},
"uri": "postgres://Gw7n8pHTvpM2gh7t:No963ndbbsfndJoj@10.11.241.0:50257/yD6nAoGVmfmqnbex",
"username": "Gw7n8pHTvpM2gh7t"
},
"instance_name": "cispostgres",
"label": "postgresql",
"name": "cispostgres",
"plan": "v9.6-dev",
"provider": null,
"syslog_drain_url": null,
"tags": [
"postgresql",
"relational"
],
"volume_mounts": []
}
]
当我启动该应用程序时,cloud foundry 正在创建一个 DataSource 对象,并将其放入 spring 的上下文中,并按照预期从之前的 vcaps 中进行精确配置。
关注另一个问题:
我正在尝试覆盖数据源 neam 对象,以便能够将数据库的模式名称连接到 url,如下所示:
@Bean(name = "dataSource")
@Primary
public DataSource createDataSource() throws SQLException {
String dbUri = "jdbc:postgresql://10.11.241.0:50257/yD6nAoGVmfmqnbex?currentSchema=accounts";
String username = "Gw7n8pHTvpM2gh7t";
String password = "No963ndbbsfndJoj";
DataSource dataSource = DataSourceBuilder.create()
.url(dbUri)
.username(username)
.password(password)
.type(org.postgresql.ds.PGSimpleDataSource.class)
.driverClassName(DRIVER_CLASS_NAME)
.build();
return dataSource;
}
不幸的是,cloud founday 似乎覆盖了我的 bean,并在我的 bean 创建后创建了一个新的。
当我执行以下 CF 命令时:
$ cf us myapp mypostgres
$ cf restart myapp
我的 bean 没有过度加热,而且工作正常。
我正在尝试找到一种方法来取消由 cloud foundary 或任何为我做的自动配置。
有什么想法吗?
提前致谢
有几种方法可以选择退出自动重新配置。
如果您的应用程序具有从 AbstractCloudConfig
扩展的 Java 配置,或者如果您定义了一个 @Bean
输入 Cloud
。在任何一种情况下,自动重新配置都应该看到您正在进行手动配置并退出。
这没有很好的记录,但 first two sections here 暗示了它。
您可以通过将环境变量 JBP_CONFIG_SPRING_AUTO_RECONFIGURATION
设置为 { enabled: false }
来完全禁用自动重新配置。这将完全打开自动重新配置。见 docs here for reference.
这两个选项之间的主要区别是后者告诉 Java buildpack 甚至不安装自动重新配置,这意味着您失去了一些额外的功能,例如 cloud.services
属性 占位符和 cloud
Spring 配置文件的自动添加。
我个人更喜欢选项 #2,因为我不使用 cloud.services
属性 占位符并且通过添加环境变量 SPRING_PROFILES_ACTIVE
启用云配置文件很容易并将其设置为 cloud
,假设您需要它。
希望对您有所帮助!
我有一个 spring 引导应用程序绑定到 cloud foundry 环境中的数据库服务实例 (postgres)。 应用程序的 VCAP 包括以下绑定:
"postgresql": [
{
"binding_name": null,
"credentials": {
"dbname": "yD6nAoGVmfmqnbex",
"end_points": [
{
"host": "10.11.241.0",
"network_id": "SF",
"port": "50257"
}
],
"hostname": "10.11.241.0",
"password": "No963ndbbsfndJoj",
"port": "50257",
"ports": {
"5432/tcp": "50257"
},
"uri": "postgres://Gw7n8pHTvpM2gh7t:No963ndbbsfndJoj@10.11.241.0:50257/yD6nAoGVmfmqnbex",
"username": "Gw7n8pHTvpM2gh7t"
},
"instance_name": "cispostgres",
"label": "postgresql",
"name": "cispostgres",
"plan": "v9.6-dev",
"provider": null,
"syslog_drain_url": null,
"tags": [
"postgresql",
"relational"
],
"volume_mounts": []
}
]
当我启动该应用程序时,cloud foundry 正在创建一个 DataSource 对象,并将其放入 spring 的上下文中,并按照预期从之前的 vcaps 中进行精确配置。
关注另一个问题:
我正在尝试覆盖数据源 neam 对象,以便能够将数据库的模式名称连接到 url,如下所示:
@Bean(name = "dataSource")
@Primary
public DataSource createDataSource() throws SQLException {
String dbUri = "jdbc:postgresql://10.11.241.0:50257/yD6nAoGVmfmqnbex?currentSchema=accounts";
String username = "Gw7n8pHTvpM2gh7t";
String password = "No963ndbbsfndJoj";
DataSource dataSource = DataSourceBuilder.create()
.url(dbUri)
.username(username)
.password(password)
.type(org.postgresql.ds.PGSimpleDataSource.class)
.driverClassName(DRIVER_CLASS_NAME)
.build();
return dataSource;
}
不幸的是,cloud founday 似乎覆盖了我的 bean,并在我的 bean 创建后创建了一个新的。
当我执行以下 CF 命令时:
$ cf us myapp mypostgres
$ cf restart myapp
我的 bean 没有过度加热,而且工作正常。 我正在尝试找到一种方法来取消由 cloud foundary 或任何为我做的自动配置。
有什么想法吗?
提前致谢
有几种方法可以选择退出自动重新配置。
如果您的应用程序具有从
AbstractCloudConfig
扩展的 Java 配置,或者如果您定义了一个@Bean
输入Cloud
。在任何一种情况下,自动重新配置都应该看到您正在进行手动配置并退出。这没有很好的记录,但 first two sections here 暗示了它。
您可以通过将环境变量
JBP_CONFIG_SPRING_AUTO_RECONFIGURATION
设置为{ enabled: false }
来完全禁用自动重新配置。这将完全打开自动重新配置。见 docs here for reference.
这两个选项之间的主要区别是后者告诉 Java buildpack 甚至不安装自动重新配置,这意味着您失去了一些额外的功能,例如 cloud.services
属性 占位符和 cloud
Spring 配置文件的自动添加。
我个人更喜欢选项 #2,因为我不使用 cloud.services
属性 占位符并且通过添加环境变量 SPRING_PROFILES_ACTIVE
启用云配置文件很容易并将其设置为 cloud
,假设您需要它。
希望对您有所帮助!