我的 spring 启动应用程序在 PCF 中,因为 PCF 没有在运行时更改属性文件的选项,我试图将值放在 PCF VCAP_SERVICES - 用户提供的凭据中。
我尝试@ConfigurationProperties按照 Pivotal 和 我得到空异常。
@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 对象中的凭据。 但是有错误 Servlet.service(( for servlet [dispatcherServlet] 在路径 [/myservice] 的上下文中抛出了异常 2019-08-20T17:32:43.728-04:00 [APP/PROC/WEB/0] [OUT] java.lang.NullPointerException: null
好吧,你所拥有的在理论上应该有效。不过,这是一种从VCAP_SERVICES解析配置的脆弱方法,这是我对你遇到问题的原因的猜测。@ConfigurationProperties
的前缀必须完全正确,Spring 才能查找该值,并且前缀将取决于您绑定的服务的名称。
Spring Boot 将以以下格式映射绑定到您的应用程序的服务:vcap.services.<service name>.credentials.<credential-key>
。有关详细信息,请参阅此处的文档。
如果没有正确的服务实例名称,则它将无法绑定到配置属性对象。
下面是一个示例:
- 我有一个名为
scheduler
的服务。 -
它生成以下 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": [] } ] }
-
我可以使用以下类来读取它的凭据。
@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(。
有关更多详细信息,请阅读此博客文章