Merge branch '2.1.x'

pull/15694/head
Madhura Bhave 6 years ago
commit 2ab0925222

@ -76,6 +76,17 @@ public class ValidationBindHandler extends AbstractBindHandler {
super.onFinish(name, target, context, result); super.onFinish(name, target, context, result);
} }
@Override
public Object onFailure(ConfigurationPropertyName name, Bindable<?> target,
BindContext context, Exception error) throws Exception {
Object result = super.onFailure(name, target, context, error);
validate(name, target, context, null);
if (!this.exceptions.isEmpty()) {
throw this.exceptions.pop();
}
return result;
}
private void validate(ConfigurationPropertyName name, Bindable<?> target, private void validate(ConfigurationPropertyName name, Bindable<?> target,
BindContext context, Object result) { BindContext context, Object result) {
Object validationTarget = getValidationTarget(target, context, result); Object validationTarget = getValidationTarget(target, context, result);

@ -27,6 +27,8 @@ import javax.validation.constraints.NotNull;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.context.properties.bind.AbstractBindHandler;
import org.springframework.boot.context.properties.bind.BindContext;
import org.springframework.boot.context.properties.bind.BindException; import org.springframework.boot.context.properties.bind.BindException;
import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.context.properties.bind.Binder;
@ -35,6 +37,7 @@ import org.springframework.boot.context.properties.source.ConfigurationPropertyN
import org.springframework.boot.context.properties.source.ConfigurationPropertySource; import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MockConfigurationPropertySource; import org.springframework.boot.context.properties.source.MockConfigurationPropertySource;
import org.springframework.boot.origin.Origin; import org.springframework.boot.origin.Origin;
import org.springframework.core.convert.ConverterNotFoundException;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError; import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -57,12 +60,14 @@ public class ValidationBindHandlerTests {
private Binder binder; private Binder binder;
private LocalValidatorFactoryBean validator;
@Before @Before
public void setup() { public void setup() {
this.binder = new Binder(this.sources); this.binder = new Binder(this.sources);
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); this.validator = new LocalValidatorFactoryBean();
validator.afterPropertiesSet(); this.validator.afterPropertiesSet();
this.handler = new ValidationBindHandler(validator); this.handler = new ValidationBindHandler(this.validator);
} }
@Test @Test
@ -162,6 +167,34 @@ public class ValidationBindHandlerTests {
this.handler); this.handler);
} }
@Test
public void bindShouldNotValidateIfOtherHandlersInChainThrowError() {
this.sources.add(new MockConfigurationPropertySource("foo", "hello"));
ExampleValidatedBean bean = new ExampleValidatedBean();
assertThatExceptionOfType(BindException.class)
.isThrownBy(
() -> this.binder.bind("foo",
Bindable.of(ExampleValidatedBean.class)
.withExistingValue(bean),
this.handler))
.withCauseInstanceOf(ConverterNotFoundException.class);
}
@Test
public void bindShouldValidateIfOtherHandlersInChainIgnoreError() {
TestHandler testHandler = new TestHandler();
this.handler = new ValidationBindHandler(testHandler, this.validator);
this.sources.add(new MockConfigurationPropertySource("foo", "hello"));
ExampleValidatedBean bean = new ExampleValidatedBean();
assertThatExceptionOfType(BindException.class)
.isThrownBy(
() -> this.binder.bind("foo",
Bindable.of(ExampleValidatedBean.class)
.withExistingValue(bean),
this.handler))
.withCauseInstanceOf(BindValidationException.class);
}
private BindValidationException bindAndExpectValidationError(Runnable action) { private BindValidationException bindAndExpectValidationError(Runnable action) {
try { try {
action.run(); action.run();
@ -265,4 +298,14 @@ public class ValidationBindHandlerTests {
} }
static class TestHandler extends AbstractBindHandler {
@Override
public Object onFailure(ConfigurationPropertyName name, Bindable<?> target,
BindContext context, Exception error) throws Exception {
return null;
}
}
} }

Loading…
Cancel
Save