我的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:空
答案 0 :(得分:0)
嗯,理论上您应该拥有的东西。但是,这是一种从VCAP_SERVICES解析配置的脆弱方法,这就是我猜测为什么会有问题的原因。 @ConfigurationProperties
的前缀必须完全正确,Spring才能查询该值,并且该前缀将取决于您绑定的服务的名称。
Spring Boot将以vcap.services.<service name>.credentials.<credential-key>
格式映射绑定到您的应用程序的服务。有关详细信息,请参见the docs here。
如果您没有正确的服务实例名称,则它将无法绑定到您的配置属性对象。
这是一个例子:
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)。
有关更多详细信息,请阅读this blog post