无法使用 java 访问用户提供的服务指定的环境变量

can not access environment variable specified by user provided service with java

我创建了一个用户提供的服务如下:

cf cups myservice -p '{"db": "text"}'

我将此服务绑定到我的应用程序,服务名称是 myservice。 当我使用 cf env 命令时,我可以看到消息:

"user-provided": [{
    "credentials":{
        "db":"text"
    },
    "name":"myservice"    
}]

但是当我使用 java

访问这个变量时
System.getenv("cloud.services.myservice.db")

为空。为什么我无法访问 db 值?

当您在您的应用程序上执行 cf env 时,您会看到一个名为 VCAP_SERVICES 的环境变量,其中包含一个 JSON 数据结构,如您所示:

VCAP_SERVICES: {
  "user-provided": [
    { 
      "credentials":{ "db":"text" }, 
      "name":"myservice"
    }
  ]
}

您的应用程序可以使用 System.getenv("VCAP_SERVICES") 检索此 JSON 结构。例如,您可以将该调用中的 JSON returned 解析为 Map,并检索所需的值。

您的名为 cloud.services.myservice.db 的应用没有可用的环境变量,因此 System.getenv("cloud.services.myservice.db") 不会 return 任何有用的东西。

Spring Boot 解析 VCAP_SERVICES 环境变量并创建 Spring 环境属性,如 cloud.services.myservice.credentials.dbvcap.services.myservice.credentials.db。无法使用 System.getenv() 检索这些属性,因为它们仅存在于 Spring 环境抽象中,而不存在于 OS 环境中。这在 Spring blog post. More details are in the Spring Boot javadoc 中有很好的描述。

CloudFoundry 中的服务在 VCAP_SERVICES 环境变量中呈现 JSON blob。

在 Java 中,您将能够获得包含所有服务的对象:

JSONObject vcap = new JSONObject(System.getenv("VCAP_SERVICES"));

https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html 有关提供的环境变量的更多信息。