Commit 1b48daf1 authored by Andy Wilkinson's avatar Andy Wilkinson

Do not ignore unknown fields when invalid fields are being ignored

Previously, ignoring invalid fields would cause the failure for an
unknown field to be ignored, irrespective of the ignoreUnknownFields
attribute on `@ConfigurationProperties`.

This commit updates the NoUnboundElementsBindHandler to ensure that
any UnboundConfigurationPropertiesException is thrown rather than
being ignored when the handler has been wrapped by an
IgnoreErrorsBindHandler.

Fixes gh-22308
parent 41954533
......@@ -72,6 +72,15 @@ public class NoUnboundElementsBindHandler extends AbstractBindHandler {
return super.onSuccess(name, target, context, result);
}
@Override
public Object onFailure(ConfigurationPropertyName name, Bindable<?> target, BindContext context, Exception error)
throws Exception {
if (error instanceof UnboundConfigurationPropertiesException) {
throw error;
}
return super.onFailure(name, target, context, error);
}
@Override
public void onFinish(ConfigurationPropertyName name, Bindable<?> target, BindContext context, Object result)
throws Exception {
......
......@@ -170,6 +170,14 @@ class ConfigurationPropertiesTests {
.withCauseInstanceOf(BindException.class);
}
@Test
void givenIgnoreUnknownFieldsFalseAndIgnoreInvalidFieldsTrueWhenThereAreUnknownFieldsThenBindingShouldFail() {
removeSystemProperties();
assertThatExceptionOfType(ConfigurationPropertiesBindException.class).isThrownBy(
() -> load(IgnoreUnknownFieldsFalseIgnoreInvalidFieldsTrueConfiguration.class, "name=foo", "bar=baz"))
.withCauseInstanceOf(BindException.class);
}
@Test
void loadWhenHasIgnoreInvalidFieldsTrueAndInvalidFieldsShouldBind() {
load(IgnoreInvalidFieldsFalseProperties.class, "com.example.bar=spam");
......@@ -961,6 +969,12 @@ class ConfigurationPropertiesTests {
}
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(IgnoreUnknownFieldsFalseIgnoreInvalidFieldsTrueProperties.class)
static class IgnoreUnknownFieldsFalseIgnoreInvalidFieldsTrueConfiguration {
}
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(PrefixProperties.class)
static class PrefixConfiguration {
......@@ -1408,6 +1422,11 @@ class ConfigurationPropertiesTests {
}
@ConfigurationProperties(ignoreUnknownFields = false, ignoreInvalidFields = true)
static class IgnoreUnknownFieldsFalseIgnoreInvalidFieldsTrueProperties extends BasicProperties {
}
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "com.example", ignoreInvalidFields = true)
static class IgnoreInvalidFieldsFalseProperties {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment