Luciana Oliveira
Luciana Oliveira

Reputation: 1137

ERROR :docker Spring boot container : java.lang.IllegalArgumentException: Could not resolve placeholder 'CASSANDRA_HOST' in value "${CASSANDRA_HOST}"

I'm running a spring boot application inside docker container and that it is linked another Cassandra's container with a docker network (drive bridge). The problem is that I'm using an environment variable linux called CASSANDRA_HOST to save the Cassandra's container IP and the spring boot could not resolve placeholder 'CASSANDRA_HOST' in value "${CASSANDRA_HOST}".

The environment variable was created ok in the Spring Boot container. And I tested other environment variable and some works and others doesn't work. So, I don't understand where is the error.

ERROR:

 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'CASSANDRA_HOST' in value "${CASSANDRA_HOST}"
                at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)
                at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)
                at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)
                at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
                at org.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:230)
                at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:88)
                at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:62)
                at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:535)
                at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:137)
                at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:133)
                at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:85)
                at org.springframework.core.env.PropertySourcesPropertyResolver.getPropertyAsRawString(PropertySourcesPropertyResolver.java:74)
                at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:151)
                at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)
                at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)
                at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
                at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175)
                at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1321)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
                at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
                ... 59 more

In the application.properties, I set the variable as below:

cassandra.contactpoints= ${CASSANDRA_HOST}

In the class CassandraCoonfig, I set the @value to read the IP:

@Configuration 
public class CassandraConfig extends  AbstractCassandraConfiguration {

    @Value("${cassandra.contactpoints}")    
    private String contactPoints;

In the POM.XML, I'm using the tag < filtering >:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

EDIT: This is the print of all environment variable in the spring container. The CASSANDRA_HOST is there in the line 14.

enter image description here

Upvotes: 3

Views: 2488

Answers (2)

Ben
Ben

Reputation: 717

My solution is

@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    PropertySourcesPlaceholderConfigurer placeholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    placeholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
    return placeholderConfigurer;
}

Set whether to ignore unresolvable placeholders. Default is "false": An exception will be thrown if a placeholder fails to resolve. Switch this flag to "true" in order to preserve the placeholder String as-is in such a case, leaving it up to other placeholder configurers to resolve it.

Upvotes: 1

Luciana Oliveira
Luciana Oliveira

Reputation: 1137

I resolved this issue building a bridge in the docker-compose.yml with the command below:

networks:
  net:
    driver: "bridge"

This is the complete docker-compose.yml:

version: '3'

services:
  ... (your code)
  networks: 
    - net

networks:
      net:
        driver: "bridge"

With this net in the docker image, in the container, you inspect the net and you'll find the IP that you need. Then you set the environment variable with this IP.

It resolved in my scenario.

Upvotes: 1

Related Questions