Spring-boot: Credentials of cloudfoundry service cannot be resolved anymore

Created on 28 Feb 2020  路  13Comments  路  Source: spring-projects/spring-boot

We have just upgraded from 2.2.4 to 2.2.5 and the following property of a user-provided service on cloudfoundry (PWS in our case) cannot be resolved anymore:
Could not resolve placeholder 'vcap.services.elastic.credentials.sslUri' in value "${vcap.services.elastic.credentials.sslUri}"

We use that property in our application-dev.yml.

Since this causes the application startup to fail, we currently cannot upgrade. Is there any workaround?

regression

Most helpful comment

All 13 comments

I have a similar issue after the same (2.2.4 -> 2.2.5) upgrade with a different provider (Swisscom).

@rreitmann & @tornaia I guess this is caused by https://github.com/spring-projects/spring-boot/commit/544dca7f1b8a2adf7921f7c56b86f7abb8f37964 respectively #18915 . I would try wrapping sslUri with []. E.g. ${vcap.services.elastic.credentials[sslUri]} - at least until the Spring Boot team has a better recommendation/fix.

@dreis2211 Your workaround works for me! Thanks a lot and I think that this really demonstrates the power :muscle: of the spring boot community :smile:

IMHO someone should adjust the documentation of CloudFoundryVcapEnvironmentPostProcessor in case this change has been intended...

@rreitmann Glad this works for you. In case this wasn't intended, I'm also happy to provide a fix for it and allowing uppercase keys again.

Thank you @rreitmann and @dreis2211! The suggested workaround works very well! 鉂わ笍馃槃

Thanks @dreis2211 the suggested workaround also helps in case of underscores, even with the dot before the brackets!

My case:
@Value("${vcap.services.backend-authentication.credentials.[key_password]}")

As mentioned in #20364, @ConfigurationProperties also seem to be broken.
Wrapped properties are not automatically mapped to the fields inside the @ConfigurationProperties-annotated class:

vcap.services.asdcs-document-db.credentials.[ca_cert] = https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
vcap.services.asdcs-document-db.credentials.[instance_identifier] = d1234567890-12345671-12351
vcap.services.asdcs-document-db.credentials.[reader-endpoint] =  docdb-with-identifier-reader.eu-west-1.docdb.amazonaws.com

results in:

@Configuration
@ConfigurationProperties("vcap.services.asdcs-document-db.credentials")
public class CloudFoundryAwsDocumentDbCredentials {

  String caCert; // is null
  String instanceIdentifier; //is null
  ...
  String readerEndpoint; //is null
  ...
}

I face a similar issue, I am not able to bind my creds to the application.yml, I upgraded my spring boot version to 2.2.6-RELEASE, still same problem, is this issue fixed ?

gradle file:
id 'org.springframework.boot' version '2.2.6.RELEASE'

application.yml

storage:
  credentials:
    encoded-key: ${vcap.services.google-storage.credentials.[privateKeyData]}
  project-id: <project name>

Error I get in the console.

     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     ... 27 common frames omitted
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.google.cloud.storage.Storage]: Factory method 'storage' threw exception; nested exception is java.lang.IllegalArgumentException: Illegal base64 character 24
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     ... 52 common frames omitted
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT Caused by: java.lang.IllegalArgumentException: Illegal base64 character 24
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at java.util.Base64$Decoder.decode0(Base64.java:714) ~[na:1.8.0_232]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at java.util.Base64$Decoder.decode(Base64.java:526) ~[na:1.8.0_232]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at java.util.Base64$Decoder.decode(Base64.java:549) ~[na:1.8.0_232]
   2020-04-01T06:31:07.78-0400 [APP/PROC/WEB/0] OUT     at org.springframework.cloud.gcp.core.DefaultCredentialsProvider.<init>(DefaultCredentialsProvider.java:100) ~[spring-cloud-gcp-core-1.2.0.RELEASE.jar:1.2.0.RELEASE]

Please confirm if this is fixed in the latest version of spring boot / which version of spring boot to be used to fix this

@deiveehan This problem was specific to the consumption of properties that are provided by the VCAP_SERVICES environment variable. Credentials configured via application.yml are not affected.

I am able to get it to to work after I added spring cloud starter cloud foundry into my gradle build which helpe me in injecting the vcap services of google storage to the spring cloud GCP.

Refer: https://github.com/spring-cloud/spring-cloud-gcp/issues/2297

Was this page helpful?
0 / 5 - 0 ratings