Remove deprecated support for FailureAnalyzer setter injection
See gh-38322
This commit is contained in:
committed by
Andy Wilkinson
parent
5675d79243
commit
697b252957
@@ -22,16 +22,13 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.BeanFactoryAware;
|
||||
import org.springframework.boot.SpringBootExceptionReporter;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.EnvironmentAware;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.io.support.SpringFactoriesLoader;
|
||||
import org.springframework.core.io.support.SpringFactoriesLoader.ArgumentResolver;
|
||||
import org.springframework.core.io.support.SpringFactoriesLoader.FailureHandler;
|
||||
import org.springframework.core.log.LogMessage;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Utility to trigger {@link FailureAnalyzer} and {@link FailureAnalysisReporter}
|
||||
@@ -61,39 +58,8 @@ final class FailureAnalyzers implements SpringBootExceptionReporter {
|
||||
|
||||
FailureAnalyzers(ConfigurableApplicationContext context, SpringFactoriesLoader springFactoriesLoader) {
|
||||
this.springFactoriesLoader = springFactoriesLoader;
|
||||
this.analyzers = loadFailureAnalyzers(context, this.springFactoriesLoader);
|
||||
}
|
||||
|
||||
private static List<FailureAnalyzer> loadFailureAnalyzers(ConfigurableApplicationContext context,
|
||||
SpringFactoriesLoader springFactoriesLoader) {
|
||||
List<FailureAnalyzer> analyzers = springFactoriesLoader.load(FailureAnalyzer.class,
|
||||
getArgumentResolver(context), FailureHandler.logging(logger));
|
||||
List<FailureAnalyzer> awareAnalyzers = analyzers.stream()
|
||||
.filter((analyzer) -> analyzer instanceof BeanFactoryAware || analyzer instanceof EnvironmentAware)
|
||||
.toList();
|
||||
if (!awareAnalyzers.isEmpty()) {
|
||||
String awareAnalyzerNames = StringUtils.collectionToCommaDelimitedString(
|
||||
awareAnalyzers.stream().map((analyzer) -> analyzer.getClass().getName()).toList());
|
||||
logger.warn(LogMessage.format(
|
||||
"FailureAnalyzers [%s] implement BeanFactoryAware or EnvironmentAware. "
|
||||
+ "Support for these interfaces on FailureAnalyzers is deprecated, "
|
||||
+ "and will be removed in a future release. "
|
||||
+ "Instead provide a constructor that accepts BeanFactory or Environment parameters.",
|
||||
awareAnalyzerNames));
|
||||
if (context == null) {
|
||||
logger.trace(LogMessage.format("Skipping [%s] due to missing context", awareAnalyzerNames));
|
||||
return analyzers.stream().filter((analyzer) -> !awareAnalyzers.contains(analyzer)).toList();
|
||||
}
|
||||
awareAnalyzers.forEach((analyzer) -> {
|
||||
if (analyzer instanceof BeanFactoryAware beanFactoryAware) {
|
||||
beanFactoryAware.setBeanFactory(context.getBeanFactory());
|
||||
}
|
||||
if (analyzer instanceof EnvironmentAware environmentAware) {
|
||||
environmentAware.setEnvironment(context.getEnvironment());
|
||||
}
|
||||
});
|
||||
}
|
||||
return analyzers;
|
||||
this.analyzers = springFactoriesLoader.load(FailureAnalyzer.class, getArgumentResolver(context),
|
||||
FailureHandler.logging(logger));
|
||||
}
|
||||
|
||||
private static ArgumentResolver getArgumentResolver(ConfigurableApplicationContext context) {
|
||||
|
||||
@@ -21,16 +21,13 @@ import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.BeanFactoryAware;
|
||||
import org.springframework.boot.testsupport.system.CapturedOutput;
|
||||
import org.springframework.boot.testsupport.system.OutputCaptureExtension;
|
||||
import org.springframework.context.EnvironmentAware;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.test.io.support.MockSpringFactoriesLoader;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.same;
|
||||
import static org.mockito.BDDMockito.then;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
@@ -45,20 +42,13 @@ import static org.mockito.Mockito.times;
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class FailureAnalyzersTests {
|
||||
|
||||
private static AwareFailureAnalyzer failureAnalyzer;
|
||||
private static FailureAnalyzer failureAnalyzer;
|
||||
|
||||
private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
|
||||
|
||||
@BeforeEach
|
||||
void configureMock() {
|
||||
failureAnalyzer = mock(AwareFailureAnalyzer.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void analyzersAreLoadedAndCalled() {
|
||||
RuntimeException failure = new RuntimeException();
|
||||
analyzeAndReport(failure, BasicFailureAnalyzer.class, StandardAwareFailureAnalyzer.class);
|
||||
then(failureAnalyzer).should(times(2)).analyze(failure);
|
||||
failureAnalyzer = mock(FailureAnalyzer.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -77,22 +67,6 @@ class FailureAnalyzersTests {
|
||||
assertThat(output).doesNotContain("implement BeanFactoryAware or EnvironmentAware");
|
||||
}
|
||||
|
||||
@Test
|
||||
void beanFactoryIsInjectedIntoBeanFactoryAwareFailureAnalyzers(CapturedOutput output) {
|
||||
RuntimeException failure = new RuntimeException();
|
||||
analyzeAndReport(failure, BasicFailureAnalyzer.class, StandardAwareFailureAnalyzer.class);
|
||||
then(failureAnalyzer).should().setBeanFactory(same(this.context.getBeanFactory()));
|
||||
assertThat(output).contains("FailureAnalyzers [" + StandardAwareFailureAnalyzer.class.getName()
|
||||
+ "] implement BeanFactoryAware or EnvironmentAware.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void environmentIsInjectedIntoEnvironmentAwareFailureAnalyzers() {
|
||||
RuntimeException failure = new RuntimeException();
|
||||
analyzeAndReport(failure, BasicFailureAnalyzer.class, StandardAwareFailureAnalyzer.class);
|
||||
then(failureAnalyzer).should().setEnvironment(same(this.context.getEnvironment()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void analyzerThatFailsDuringInitializationDoesNotPreventOtherAnalyzersFromBeingCalled() {
|
||||
RuntimeException failure = new RuntimeException();
|
||||
@@ -170,22 +144,4 @@ class FailureAnalyzersTests {
|
||||
|
||||
}
|
||||
|
||||
interface AwareFailureAnalyzer extends BeanFactoryAware, EnvironmentAware, FailureAnalyzer {
|
||||
|
||||
}
|
||||
|
||||
static class StandardAwareFailureAnalyzer extends BasicFailureAnalyzer implements AwareFailureAnalyzer {
|
||||
|
||||
@Override
|
||||
public void setEnvironment(Environment environment) {
|
||||
failureAnalyzer.setEnvironment(environment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBeanFactory(BeanFactory beanFactory) {
|
||||
failureAnalyzer.setBeanFactory(beanFactory);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user