BindValidationFailureAnalyzerTests Class — spring-boot Architecture
Architecture documentation for the BindValidationFailureAnalyzerTests class in BindValidationFailureAnalyzerTests.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BindValidationFailureAnalyzerTests.java lines 52–218
class BindValidationFailureAnalyzerTests {
@BeforeEach
void setup() {
LocaleContextHolder.setLocale(Locale.US);
}
@AfterEach
void cleanup() {
LocaleContextHolder.resetLocaleContext();
}
@Test
void bindExceptionWithFieldErrorsDueToValidationFailure() {
FailureAnalysis analysis = performAnalysis(FieldValidationFailureConfiguration.class);
assertThat(analysis).isNotNull();
assertThat(analysis.getDescription()).contains(failure("test.foo.foo", "null", "must not be null"))
.contains(failure("test.foo.value", "0", "at least five"))
.contains(failure("test.foo.nested.bar", "null", "must not be null"))
.contains(
"Binding to target org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzerTests$FieldValidationFailureProperties failed:");
}
@Test
void bindExceptionWithOriginDueToValidationFailure() {
FailureAnalysis analysis = performAnalysis(FieldValidationFailureConfiguration.class, "test.foo.value=4");
assertThat(analysis).isNotNull();
assertThat(analysis.getDescription()).contains("Origin: \"test.foo.value\" from property source \"test\"");
}
@Test
void bindExceptionWithObjectErrorsDueToValidationFailure() {
FailureAnalysis analysis = performAnalysis(ObjectValidationFailureConfiguration.class);
assertThat(analysis).isNotNull();
assertThat(analysis.getDescription()).contains("Reason: This object could not be bound.");
}
@Test
void otherBindExceptionShouldReturnAnalysis() {
BindException cause = new BindException(new FieldValidationFailureProperties(),
"fieldValidationFailureProperties");
cause.addError(new FieldError("test", "value", "must not be null"));
BeanCreationException rootFailure = new BeanCreationException("bean creation failure", cause);
FailureAnalysis analysis = new BindValidationFailureAnalyzer().analyze(rootFailure, rootFailure);
assertThat(analysis).isNotNull();
assertThat(analysis.getDescription()).contains(failure("test.value", "null", "must not be null"));
}
private static String failure(String property, String value, String reason) {
return String.format("Property: %s%n Value: \"%s\"%n Reason: %s", property, value, reason);
}
private @Nullable FailureAnalysis performAnalysis(Class<?> configuration, String... environment) {
BeanCreationException failure = createFailure(configuration, environment);
assertThat(failure).isNotNull();
return new BindValidationFailureAnalyzer().analyze(failure);
}
private @Nullable BeanCreationException createFailure(Class<?> configuration, String... environment) {
try {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
addEnvironment(context, environment);
context.register(configuration);
context.refresh();
context.close();
return null;
}
catch (BeanCreationException ex) {
return ex;
}
}
private void addEnvironment(AnnotationConfigApplicationContext context, String[] environment) {
MutablePropertySources sources = context.getEnvironment().getPropertySources();
Map<String, Object> map = new HashMap<>();
for (String pair : environment) {
int index = pair.indexOf('=');
String key = (index > 0) ? pair.substring(0, index) : pair;
String value = (index > 0) ? pair.substring(index + 1) : "";
map.put(key.trim(), value.trim());
}
sources.addFirst(new MapPropertySource("test", map));
}
@EnableConfigurationProperties(FieldValidationFailureProperties.class)
static class FieldValidationFailureConfiguration {
}
@EnableConfigurationProperties(ObjectErrorFailureProperties.class)
static class ObjectValidationFailureConfiguration {
}
@ConfigurationProperties("test.foo")
@Validated
static class FieldValidationFailureProperties {
@NotNull
@SuppressWarnings("NullAway.Init")
private String foo;
@Min(value = 5, message = "at least five")
private int value;
@Valid
private FieldValidationFailureProperties.Nested nested = new FieldValidationFailureProperties.Nested();
String getFoo() {
return this.foo;
}
void setFoo(String foo) {
this.foo = foo;
}
int getValue() {
return this.value;
}
void setValue(int value) {
this.value = value;
}
FieldValidationFailureProperties.Nested getNested() {
return this.nested;
}
void setNested(FieldValidationFailureProperties.Nested nested) {
this.nested = nested;
}
static class Nested {
@NotNull
@SuppressWarnings("NullAway.Init")
private String bar;
String getBar() {
return this.bar;
}
void setBar(String bar) {
this.bar = bar;
}
}
}
@ConfigurationProperties("foo.bar")
@Validated
static class ObjectErrorFailureProperties implements Validator {
@Override
public void validate(Object target, Errors errors) {
errors.reject("my.objectError", "This object could not be bound.");
}
@Override
public boolean supports(Class<?> type) {
return true;
}
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free