在春季启动中无法从vcap_services中提供的用户中检索凭证

时间:2019-08-20 21:53:35

标签: java spring spring-boot pivotal-cloud-foundry pcfdev

我的spring boot应用程序在PCF中,因为PCF没有在运行时更改属性文件的选项,所以我试图将这些值放在PCF VCAP_SERVICES用户提供的凭据中。

我尝试了根据枢纽和 我有一个空异常。

@Data
@Configuration
@ConfigurationProperties("vcap.services.app-properties.credentials")
public class RsTest {
private String username;
private String password;
//getter and setter
};

我的控制器看起来像

@RestController
public class RestApiController {
@Autowired
RsTest rsTest;

public void test() {
logger.info("RSTest: "+rsTest.getUsername());
return ResponseEntity.ok().body("some value");
}

我期望RsTest对象中的凭据。 但是有错误 路径为[/ myservice]的Servlet [dispatcherServlet]的Servlet.service()抛出异常 2019-08-20T17:32:43.728-04:00 [APP / PROC / WEB / 0] [OUT] java.lang.NullPointerException:空

1 个答案:

答案 0 :(得分:0)

嗯,理论上您应该拥有的东西。但是,这是一种从VCAP_SERVICES解析配置的脆弱方法,这就是我猜测为什么会有问题的原因。 @ConfigurationProperties的前缀必须完全正确,Spring才能查询该值,并且该前缀将取决于您绑定的服务的名称。

Spring Boot将以vcap.services.<service name>.credentials.<credential-key>格式映射绑定到您的应用程序的服务。有关详细信息,请参见the docs here

如果您没有正确的服务实例名称,则它将无法绑定到您的配置属性对象。

这是一个例子:

  1. 我有一个名为scheduler的服务。
  2. 它产生以下VCAP_SERVICES env变量:

    {
      "scheduler-for-pcf": [
       {
        "binding_name": null,
        "credentials": {
         "api_endpoint": "https://scheduler.run.pivotal.io"
        },
        "instance_name": "scheduler",
        "label": "scheduler-for-pcf",
        "name": "scheduler",
        "plan": "standard",
        "provider": null,
        "syslog_drain_url": null,
        "tags": [
         "scheduler"
        ],
        "volume_mounts": []
       }
      ]
     }
    
  3. 我可以使用以下类来读取其凭据。

    @Configuration
    @ConfigurationProperties(prefix = "vcap.services.scheduler.credentials")
    public class SchedulerConfig {
        private String api_endpoint;
    
        public String getApiEndpoint() {
            return api_endpoint;
        }
    
        public void setApiEndpoint(String api_endpoint) {
            this.api_endpoint = api_endpoint;
        }
    }
    

如果我将服务名称更改为fred,则前缀将需要更改为vcap.services.fred.credentials


话虽如此,您应该考虑使用java-cfenv。它更灵活,是在Java应用程序中读取VCAP_SERVICES的推荐方法(请注意-这代替了Spring Cloud Connectors)。

有关更多详细信息,请阅读this blog post