Reputation: 1646
I am trying to get an example app working for myself as I have just started to play around with Spring Boot. I have created my restful service and the next step is to get a config server running so i can dynamically refresh the properties. However my config server does not seem to load the properties. So I have the following setup :
Config Server /pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>1.0.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<artifactId>config-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
</project>
Config-Server /Application class
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@EnableConfigServer
public class ConfigurationServerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ConfigurationServerApplication.class, args);
}
}
config-server /application.yml
server:
port: ${PORT:8889}
logging:
levels:
org.springframework.boot.env.PropertySourcesLoader: TRACE
org.springframework.web: DEBUG
spring:
cloud:
config:
server:
native:
searchLocations: classpath:/config
profiles:
active: native
#conf: /Users/jlong/work/bootiful/bootiful-microservices/code/spring-doge-microservice-configuration
#my:
# property:******************myvalue***************************
In src/main/resources I have a config directory which has a hello-service.properties file in it that has the following:
very-so-much=testing
The config server starts up fine and is listening on port 8889 as the logs show
2015-10-19 15:10:32.490 INFO 7712 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'configurationPropertiesRebinder': registering with JMX server as MBean [org.springframework.cloud.context.properties:name=configurationPropertiesRebinder,type=ConfigurationPropertiesRebinder]
2015-10-19 15:10:32.499 INFO 7712 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'refreshEndpoint': registering with JMX server as MBean [org.springframework.cloud.bootstrap.config:name=refreshEndpoint,type=RefreshEndpoint]
2015-10-19 15:10:32.504 INFO 7712 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2015-10-19 15:10:32.620 INFO 7712 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8889 (http)
2015-10-19 15:10:32.622 INFO 7712 --- [ main] doge.ConfigurationServerApplication : Started ConfigurationServerApplication in 4.352 seconds (JVM running for 5.069)
I also have a spring boot restful service which I want to load the properties maintained by the config server. The restful application is as follows:
hello-service/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sample.springboot</groupId>
<artifactId>spring-restful-tutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-restful-tutorial</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>1.0.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- cloud config server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
My hello-service/app.class --ommited some code for clarity
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
@RefreshScope
CustomerProps customerProps( @Value("${very-so-much}") String exclamations) {
CustomerProps p = new CustomerProps();
p.setText(exclamations);
return p;
}
hello-service /restful service where I try to load the property omiited code for clarity
@RestController
@RequestMapping("/customer")
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
//TODO switch to autowired annotation
private CustomerRepository repository;
private final GridFsTemplate fs;
private CustomerProps props;
@Autowired
public GreetingController(CustomerRepository repository, GridFsTemplate gridFileSystem, CustomerProps props) {
this.repository = repository;
this.fs = gridFileSystem;
this.props = props;
}
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
name = props.getText();
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
And my application.properties
server.port=${PORT:9001}
spring.profiles.active=native
bootstrap.properties
spring.application.name=hello-service
spring.cloud.config.uri=http://localhost:8889
So when I hit the restful endpoint greeting it throws the exception as below
2015-10-19 15:21:41.292 INFO 8140 --- [nio-9001-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2015-10-19 15:21:41.323 INFO 8140 --- [nio-9001-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 31 ms
2015-10-19 15:22:29.727 ERROR 8140 --- [nio-9001-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'very-so-much' in string value "${very-so-much}"] with root cause
java.lang.IllegalArgumentException: Could not resolve placeholder 'very-so-much' in string value "${very-so-much}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:801)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:955)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
Anyone any ideas on what I am missing here. I have tried to post as much info as possible but if you require any further info please ask. Thanks
Upvotes: 2
Views: 3578
Reputation: 25177
spring.application.name=hello-service
needs to go in bootstrap.properties
(bootstrap not Bootstrap). Otherwise, configserver doesn't know which config to grab.
Upvotes: 1