diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver.java index 3dde32943a..6c2794b49f 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ public class PropertySourcesPlaceholdersResolver implements PlaceholdersResolver this.helper = (helper != null ? helper : new PropertyPlaceholderHelper(SystemPropertyUtils.PLACEHOLDER_PREFIX, SystemPropertyUtils.PLACEHOLDER_SUFFIX, - SystemPropertyUtils.VALUE_SEPARATOR, false)); + SystemPropertyUtils.VALUE_SEPARATOR, true)); } @Override diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzer.java index 6c4f6e30e8..582af50d58 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzer.java @@ -70,6 +70,12 @@ class BindFailureAnalyzer extends AbstractFailureAnalyzer { } private String getMessage(BindException cause) { + ConversionFailedException conversionFailure = findCause(cause, + ConversionFailedException.class); + if (conversionFailure != null) { + return "failed to convert " + conversionFailure.getSourceType() + " to " + + conversionFailure.getTargetType(); + } Throwable failure = cause; while (failure.getCause() != null) { failure = failure.getCause(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BinderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BinderTests.java index 2c57a098f0..853b4d6ac5 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BinderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BinderTests.java @@ -30,7 +30,6 @@ import org.assertj.core.matcher.AssertionMatcher; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.internal.matchers.ThrowableMessageMatcher; import org.junit.rules.ExpectedException; import org.mockito.Answers; import org.mockito.InOrder; @@ -53,7 +52,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.validation.beanvalidation.SpringValidatorAdapter; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -153,15 +151,13 @@ public class BinderTests { } @Test - public void bindToValueWithMissingPlaceholdersShouldThrowException() { + public void bindToValueWithMissingPlaceholderShouldResolveToValueWithPlaceholder() { StandardEnvironment environment = new StandardEnvironment(); this.sources.add(new MockConfigurationPropertySource("foo", "${bar}")); this.binder = new Binder(this.sources, new PropertySourcesPlaceholdersResolver(environment)); - this.thrown.expect(BindException.class); - this.thrown.expectCause(ThrowableMessageMatcher.hasMessage(containsString( - "Could not resolve placeholder 'bar' in value \"${bar}\""))); - this.binder.bind("foo", Bindable.of(Integer.class)); + BindResult result = this.binder.bind("foo", Bindable.of(String.class)); + assertThat(result.get()).isEqualTo("${bar}"); } @Test diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolverTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolverTests.java index 3b93f4cb1c..90d5253b24 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolverTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,12 +67,10 @@ public class PropertySourcesPlaceholdersResolverTests { } @Test - public void resolveIfPlaceholderAbsentAndNoDefaultShouldThrowException() { + public void resolveIfPlaceholderAbsentAndNoDefaultUsesPlaceholder() { this.resolver = new PropertySourcesPlaceholdersResolver((PropertySources) null); - this.thrown.expect(IllegalArgumentException.class); - this.thrown - .expectMessage("Could not resolve placeholder 'FOO' in value \"${FOO}\""); - this.resolver.resolvePlaceholders("${FOO}"); + Object resolved = this.resolver.resolvePlaceholders("${FOO}"); + assertThat(resolved).isEqualTo("${FOO}"); } @Test diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzerTests.java index b3542a8575..a022935095 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BindFailureAnalyzerTests.java @@ -62,10 +62,10 @@ public class BindFailureAnalyzerTests { @Test public void bindExceptionDueToOtherFailure() { FailureAnalysis analysis = performAnalysis(GenericFailureConfiguration.class, - "test.foo.value=${BAR}"); - assertThat(analysis.getDescription()).contains(failure("test.foo.value", "${BAR}", + "test.foo.value=alpha"); + assertThat(analysis.getDescription()).contains(failure("test.foo.value", "alpha", "\"test.foo.value\" from property source \"test\"", - "Could not resolve placeholder 'BAR' in value \"${BAR}\"")); + "failed to convert java.lang.String to int")); } @Test @@ -187,13 +187,13 @@ public class BindFailureAnalyzerTests { @ConfigurationProperties("test.foo") static class GenericFailureProperties { - private String value; + private int value; - public String getValue() { + public int getValue() { return this.value; } - public void setValue(String value) { + public void setValue(int value) { this.value = value; }