Browse Source

Remove nulls from description for bean defs with no res description

Previously, if a bean definition had no resource description, the
failure analysis description would state that the been had been
defined in null which was of no use to the user.

This commit updates the failure analysis to omit information about
where the bean was definied when the definition has no resource
description.

Fixes gh-18721
pull/18848/head
Andy Wilkinson 6 years ago
parent
commit
65ef03a5bf
  1. 14
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanDefinitionOverrideFailureAnalyzer.java
  2. 37
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanDefinitionOverrideFailureAnalyzerTests.java

14
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/diagnostics/analyzer/BeanDefinitionOverrideFailureAnalyzer.java

@ -42,11 +42,15 @@ class BeanDefinitionOverrideFailureAnalyzer extends AbstractFailureAnalyzer<Bean @@ -42,11 +42,15 @@ class BeanDefinitionOverrideFailureAnalyzer extends AbstractFailureAnalyzer<Bean
private String getDescription(BeanDefinitionOverrideException ex) {
StringWriter description = new StringWriter();
PrintWriter printer = new PrintWriter(description);
printer.printf(
"The bean '%s', defined in %s, could not be registered. A bean with that "
+ "name has already been defined in %s and overriding is disabled.",
ex.getBeanName(), ex.getBeanDefinition().getResourceDescription(),
ex.getExistingDefinition().getResourceDescription());
printer.printf("The bean '%s'", ex.getBeanName());
if (ex.getBeanDefinition().getResourceDescription() != null) {
printer.printf(", defined in %s,", ex.getBeanDefinition().getResourceDescription());
}
printer.printf(" could not be registered. A bean with that name has already been defined ");
if (ex.getExistingDefinition().getResourceDescription() != null) {
printer.printf("in %s ", ex.getExistingDefinition().getResourceDescription());
}
printer.printf("and overriding is disabled.");
return description.toString();
}

37
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/BeanDefinitionOverrideFailureAnalyzerTests.java

@ -16,10 +16,13 @@ @@ -16,10 +16,13 @@
package org.springframework.boot.diagnostics.analyzer;
import java.util.function.Supplier;
import org.junit.Test;
import org.springframework.beans.factory.support.BeanDefinitionOverrideException;
import org.springframework.boot.diagnostics.FailureAnalysis;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -43,6 +46,18 @@ public class BeanDefinitionOverrideFailureAnalyzerTests { @@ -43,6 +46,18 @@ public class BeanDefinitionOverrideFailureAnalyzerTests {
assertThat(description).contains(FirstConfiguration.class.getName());
}
@Test
public void analyzeBeanDefinitionOverrideExceptionWithDefinitionsWithNoResourceDescription() {
FailureAnalysis analysis = performAnalysis((context) -> {
context.registerBean("testBean", String.class, (Supplier<String>) String::new);
context.registerBean("testBean", String.class, (Supplier<String>) String::new);
});
String description = analysis.getDescription();
assertThat(description)
.isEqualTo("The bean 'testBean' could not be registered. A bean with that name has already"
+ " been defined and overriding is disabled.");
}
private FailureAnalysis performAnalysis(Class<?> configuration) {
BeanDefinitionOverrideException failure = createFailure(configuration);
assertThat(failure).isNotNull();
@ -63,6 +78,28 @@ public class BeanDefinitionOverrideFailureAnalyzerTests { @@ -63,6 +78,28 @@ public class BeanDefinitionOverrideFailureAnalyzerTests {
}
}
private FailureAnalysis performAnalysis(
ApplicationContextInitializer<AnnotationConfigApplicationContext> initializer) {
BeanDefinitionOverrideException failure = createFailure(initializer);
assertThat(failure).isNotNull();
return new BeanDefinitionOverrideFailureAnalyzer().analyze(failure);
}
private BeanDefinitionOverrideException createFailure(
ApplicationContextInitializer<AnnotationConfigApplicationContext> initializer) {
try {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.setAllowBeanDefinitionOverriding(false);
initializer.initialize(context);
context.refresh();
context.close();
return null;
}
catch (BeanDefinitionOverrideException ex) {
return ex;
}
}
@Configuration
@Import({ FirstConfiguration.class, SecondConfiguration.class })
static class BeanOverrideConfiguration {

Loading…
Cancel
Save