数据源对象被 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 或任何为我做的自动配置。

有什么想法吗?

提前致谢

有几种方法可以选择退出自动重新配置。

  1. 如果您的应用程序具有从 AbstractCloudConfig 扩展的 Java 配置,或者如果您定义了一个 @Bean输入 Cloud。在任何一种情况下,自动重新配置都应该看到您正在进行手动配置并退出。

    这没有很好的记录,但 first two sections here 暗示了它。

  2. 您可以通过将环境变量 JBP_CONFIG_SPRING_AUTO_RECONFIGURATION 设置为 { enabled: false } 来完全禁用自动重新配置。这将完全打开自动重新配置。见 docs here for reference.

这两个选项之间的主要区别是后者告诉 Java buildpack 甚至不安装自动重新配置,这意味着您失去了一些额外的功能,例如 cloud.services 属性 占位符和 cloud Spring 配置文件的自动添加。

我个人更喜欢选项 #2,因为我不使用 cloud.services 属性 占位符并且通过添加环境变量 SPRING_PROFILES_ACTIVE 启用云配置文件很容易并将其设置为 cloud,假设您需要它。

希望对您有所帮助!