diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java index 6bc09255..6be1a3a0 100644 --- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java +++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java @@ -34,6 +34,7 @@ import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.cloud.consul.ConsulAutoConfiguration; import org.springframework.cloud.consul.ConsulProperties; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.util.UriComponents; @@ -41,8 +42,12 @@ import org.springframework.web.util.UriComponentsBuilder; import static org.springframework.cloud.consul.config.ConsulConfigProperties.Format.FILES; -public class ConsulConfigDataLocationResolver - implements ConfigDataLocationResolver { +public class ConsulConfigDataLocationResolver implements ConfigDataLocationResolver { + + /** + * Consul ConfigData prefix. + */ + public static final String PREFIX = "consul:"; protected static final List DIR_SUFFIXES = Collections.singletonList("/"); @@ -50,61 +55,45 @@ public class ConsulConfigDataLocationResolver .unmodifiableList(Arrays.asList(".yml", ".yaml", ".properties")); @Override - public boolean isResolvable(ConfigDataLocationResolverContext context, - String location) { - boolean enabled = context.getBinder() - .bind(ConsulProperties.PREFIX + ".enabled", Boolean.class).orElse(true); - boolean configEnabled = context.getBinder() - .bind(ConsulConfigProperties.PREFIX + ".enabled", Boolean.class) + public boolean isResolvable(ConfigDataLocationResolverContext context, String location) { + boolean enabled = context.getBinder().bind(ConsulProperties.PREFIX + ".enabled", Boolean.class).orElse(true); + boolean configEnabled = context.getBinder().bind(ConsulConfigProperties.PREFIX + ".enabled", Boolean.class) .orElse(true); - return location.startsWith("consul:") && configEnabled && enabled; + return location.startsWith(PREFIX) && configEnabled && enabled; } @Override - public List resolve( - ConfigDataLocationResolverContext context, String location, boolean optional) - throws ConfigDataLocationNotFoundException { + public List resolve(ConfigDataLocationResolverContext context, String location, + boolean optional) throws ConfigDataLocationNotFoundException { return Collections.emptyList(); } @Override - public List resolveProfileSpecific( - ConfigDataLocationResolverContext context, String location, boolean optional, - Profiles profiles) throws ConfigDataLocationNotFoundException { + public List resolveProfileSpecific(ConfigDataLocationResolverContext context, + String location, boolean optional, Profiles profiles) throws ConfigDataLocationNotFoundException { UriComponents locationUri = parseLocation(context, location); - ConsulConfigProperties properties = loadConfigProperties(context.getBinder(), - locationUri); + ConsulConfigProperties properties = loadConfigProperties(context.getBinder(), locationUri); - String appName = properties.getName(); - if (StringUtils.isEmpty(appName)) { - appName = context.getBinder().bind("spring.application.name", String.class) - .orElse("application"); - } + List contexts = (locationUri == null || CollectionUtils.isEmpty(locationUri.getPathSegments())) + ? getAutomaticContexts(profiles, properties) : getCustomContexts(locationUri, properties); - List contexts = (CollectionUtils.isEmpty(locationUri.getPathSegments())) - ? getAutomaticContexts(profiles, properties, appName) - : getCustomContexts(locationUri, properties); - - registerBean(context, ConsulClient.class, - () -> createConsulClient(context, locationUri)); + registerBean(context, ConsulClient.class, () -> createConsulClient(context, locationUri)); registerBean(context, ConsulConfigIndexes.class, ConsulConfigDataIndexes::new); return contexts.stream() - .map(propertySourceContext -> new ConsulConfigDataLocation(properties, - propertySourceContext, optional)) + .map(propertySourceContext -> new ConsulConfigDataLocation(properties, propertySourceContext, optional)) .collect(Collectors.toList()); } - private List getCustomContexts(UriComponents uriComponents, - ConsulConfigProperties properties) { - List contexts = new ArrayList<>(); + private List getCustomContexts(UriComponents uriComponents, ConsulConfigProperties properties) { if (StringUtils.isEmpty(uriComponents.getPath())) { - return contexts; + return Collections.emptyList(); } + List contexts = new ArrayList<>(); for (String path : uriComponents.getPath().split(";")) { for (String suffix : getSuffixes(properties)) { contexts.add(path + suffix); @@ -121,8 +110,7 @@ public class ConsulConfigDataLocationResolver return DIR_SUFFIXES; } - protected List getAutomaticContexts(Profiles profiles, - ConsulConfigProperties properties, String appName) { + protected List getAutomaticContexts(Profiles profiles, ConsulConfigProperties properties) { List contexts = new ArrayList<>(); String prefix = properties.getPrefix(); @@ -134,7 +122,8 @@ public class ConsulConfigDataLocationResolver addProfiles(contexts, defaultContext, profiles, suffix, properties); } - String baseContext = getContext(prefix, appName); + // getName() defaults to ${spring.application.name} or application + String baseContext = getContext(prefix, properties.getName()); for (String suffix : getSuffixes(properties)) { contexts.add(baseContext + suffix); @@ -156,22 +145,21 @@ public class ConsulConfigDataLocationResolver } } - protected void addProfiles(List contexts, String baseContext, - Profiles profiles, String suffix, ConsulConfigProperties properties) { + protected void addProfiles(List contexts, String baseContext, Profiles profiles, String suffix, + ConsulConfigProperties properties) { for (String profile : profiles.getAccepted()) { - contexts.add( - baseContext + properties.getProfileSeparator() + profile + suffix); + contexts.add(baseContext + properties.getProfileSeparator() + profile + suffix); } } - protected UriComponents parseLocation(ConfigDataLocationResolverContext context, - String location) { - String uri = location.substring("consul:".length()); + @Nullable + protected UriComponents parseLocation(ConfigDataLocationResolverContext context, String location) { + String uri = location.substring(PREFIX.length()); if (!StringUtils.hasText(uri)) { return null; } if (!uri.startsWith("//")) { - uri = "consul:" + "//" + uri; + uri = PREFIX + "//" + uri; } else { uri = location; @@ -179,41 +167,42 @@ public class ConsulConfigDataLocationResolver return UriComponentsBuilder.fromUriString(uri).build(); } - protected void registerBean(ConfigDataLocationResolverContext context, - Class type, Supplier supplier) { + protected void registerBean(ConfigDataLocationResolverContext context, Class type, Supplier supplier) { context.getBootstrapRegistry().register(type, supplier) - .onApplicationContextPrepared( - (ctxt, consulClient) -> ctxt.getBeanFactory().registerSingleton( - "configData" + type.getSimpleName(), consulClient)); + .onApplicationContextPrepared((ctxt, consulClient) -> ctxt.getBeanFactory() + .registerSingleton("configData" + type.getSimpleName(), consulClient)); } - protected ConsulClient createConsulClient(ConfigDataLocationResolverContext context, - UriComponents location) { + protected ConsulClient createConsulClient(ConfigDataLocationResolverContext context, UriComponents location) { ConsulProperties properties = loadProperties(context.getBinder(), location); return ConsulAutoConfiguration.createConsulClient(properties); } protected ConsulProperties loadProperties(Binder binder, UriComponents location) { - ConsulProperties consulProperties = binder - .bind(ConsulProperties.PREFIX, Bindable.of(ConsulProperties.class)) + ConsulProperties consulProperties = binder.bind(ConsulProperties.PREFIX, Bindable.of(ConsulProperties.class)) .orElse(new ConsulProperties()); - if (StringUtils.hasText(location.getHost())) { - consulProperties.setHost(location.getHost()); - } - if (location.getPort() >= 0) { - consulProperties.setPort(location.getPort()); + if (location != null) { + if (StringUtils.hasText(location.getHost())) { + consulProperties.setHost(location.getHost()); + } + if (location.getPort() >= 0) { + consulProperties.setPort(location.getPort()); + } } return consulProperties; } - protected ConsulConfigProperties loadConfigProperties(Binder binder, - UriComponents location) { - return binder - .bind(ConsulConfigProperties.PREFIX, - Bindable.of(ConsulConfigProperties.class)) + protected ConsulConfigProperties loadConfigProperties(Binder binder, UriComponents location) { + ConsulConfigProperties properties = binder + .bind(ConsulConfigProperties.PREFIX, Bindable.of(ConsulConfigProperties.class)) .orElse(new ConsulConfigProperties()); + + if (StringUtils.isEmpty(properties.getName())) { + properties.setName(binder.bind("spring.application.name", String.class).orElse("application")); + } + return properties; } protected static class ConsulConfigDataIndexes implements ConsulConfigIndexes { diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocator.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocator.java index b03822f9..7b003afa 100644 --- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocator.java +++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocator.java @@ -89,7 +89,7 @@ public class ConsulPropertySourceLocator String appName = this.properties.getName(); if (StringUtils.isEmpty(appName)) { - appName = env.getProperty("spring.application.name"); + appName = env.getProperty("spring.application.name", "application"); } List profiles = Arrays.asList(env.getActiveProfiles());