Brkk Brkk - 3 months ago 56
Java Question

Spring Could not Resolve placeholder

I'm fairly new to spring so excuse me if this is a dumb question. When I try to launch a program I get the following error:

java.lang.IllegalArgumentException: Could not resolve placeholder 'appclient' in string value [${appclient}]
. The error is thrown when the following code is executed:

package ca.virology.lib2.common.config.spring.properties;
import ca.virology.lib2.config.spring.PropertiesConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration
@Import({PropertiesConfig.class})
@PropertySource("${appclient}")
public class AppClientProperties {
private static final Logger log = LoggerFactory.getLogger(AppClientProperties.class);
{
//this initializer block will execute when an instance of this class is created by Spring
log.info("Loading AppClientProperties");
}
@Value("${appclient.port:}")
private int appClientPort;

@Value("${appclient.host:}")
private String appClientHost;

public int getAppClientPort() {
return appClientPort;
}

public String getAppClientHost() {
return appClientHost;
}
}


A property file called
appclient.properties
exists in the resources folder with the information for host and port. I'm not sure where the
"${appclient}"
is defined, if it is at all. Maybe it is not even defined and that is causing the problem. Do I need to change the
"${appclient}"
to something like
"{classpath:/appclient.properties}"
or am I missing something else?

Answer

You are not reading the properties file correctly. The propertySource should pass the parameter as: file:appclient.properties or classpath:appclient.properties. Change the annotation to:

@PropertySource(value={"classpath:appclient.properties"})

However I don't know what your PropertiesConfig file contains, as you're importing that also. Ideally the @PropertySource annotation should have been kept there.