diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 7afcb29101..159f4e7e06 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -1351,11 +1351,14 @@ for use within Logback. This can be useful if you want to access values from you `application.properties` file in your logback configuration. The tag works in a similar way to Logback's standard `` tag, but rather than specifying a direct `value` you specify the `source` of the property (from the `Environment`). You can use the `scope` -attribute if you need to store the property somewhere other than in `local` scope. +attribute if you need to store the property somewhere other than in `local` scope. If +you need a fallback value in case the property is not set in the `Environment`, you can +use the `defaultValue` attribute. [source,xml,indent=0] ---- - + ${fluentHost} ... diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/logback/SpringPropertyAction.java b/spring-boot/src/main/java/org/springframework/boot/logging/logback/SpringPropertyAction.java index 55523ff5c4..f9ad96dafc 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/logback/SpringPropertyAction.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/logback/SpringPropertyAction.java @@ -32,10 +32,12 @@ import org.springframework.core.env.Environment; * properties to be sourced from the Spring environment. * * @author Phillip Webb + * @author Eddú Meléndez */ class SpringPropertyAction extends Action { private static final String SOURCE_ATTRIBUTE = "source"; + private static final String DEFAULT_VALUE_ATTRIBUTE = "defaultValue"; private final Environment environment; @@ -49,17 +51,18 @@ class SpringPropertyAction extends Action { String name = attributes.getValue(NAME_ATTRIBUTE); String source = attributes.getValue(SOURCE_ATTRIBUTE); Scope scope = ActionUtil.stringToScope(attributes.getValue(SCOPE_ATTRIBUTE)); + String defaultValue = attributes.getValue(DEFAULT_VALUE_ATTRIBUTE); if (OptionHelper.isEmpty(name) || OptionHelper.isEmpty(source)) { addError( "The \"name\" and \"source\" attributes of must be set"); } - ActionUtil.setProperty(ic, name, getValue(source), scope); + ActionUtil.setProperty(ic, name, getValue(source, defaultValue), scope); } - private String getValue(String source) { + private String getValue(String source, String defaultValue) { if (this.environment == null) { addWarn("No Spring Environment available to resolve " + source); - return null; + return defaultValue; } String value = this.environment.getProperty(source); if (value != null) { @@ -70,9 +73,9 @@ class SpringPropertyAction extends Action { String prefix = source.substring(0, lastDot + 1); RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( this.environment, prefix); - return resolver.getProperty(source.substring(lastDot + 1)); + return resolver.getProperty(source.substring(lastDot + 1), defaultValue); } - return null; + return defaultValue; } @Override diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java index 46c49c57d7..e1b99132a6 100644 --- a/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java @@ -41,6 +41,7 @@ import static org.hamcrest.Matchers.not; * * @author Phillip Webb * @author Eddú Meléndez + * @author Stephane Nicoll */ public class SpringBootJoranConfiguratorTests { @@ -140,6 +141,30 @@ public class SpringBootJoranConfiguratorTests { assertThat(this.context.getProperty("MINE")).isEqualTo("test"); } + @Test + public void springPropertyNoValue() throws Exception { + initialize("property.xml"); + assertThat(this.context.getProperty("SIMPLE")).isNull(); + } + + @Test + public void relaxedSpringPropertyNoValue() throws Exception { + initialize("property.xml"); + assertThat(this.context.getProperty("MINE")).isNull(); + } + + @Test + public void springPropertyWithDefaultValue() throws Exception { + initialize("property-default-value.xml"); + assertThat(this.context.getProperty("SIMPLE")).isEqualTo("foo"); + } + + @Test + public void relaxedSpringPropertyWithDefaultValue() throws Exception { + initialize("property-default-value.xml"); + assertThat(this.context.getProperty("MINE")).isEqualTo("bar"); + } + private void doTestNestedProfile(boolean expected, String... profiles) throws JoranException { this.environment.setActiveProfiles(profiles); diff --git a/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml b/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml new file mode 100644 index 0000000000..dd00a99b87 --- /dev/null +++ b/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml b/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml index 5b9e062b32..15ef50ae32 100644 --- a/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml +++ b/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml @@ -1,5 +1,6 @@ +