From 547fc30eadef7fc7d505932ad066c06aafdfa032 Mon Sep 17 00:00:00 2001 From: Jorge Cordoba Date: Mon, 27 Jan 2020 09:41:59 -0700 Subject: [PATCH 1/2] Fix condition source in OnBeanCondition See gh-19948 --- .../autoconfigure/condition/OnBeanCondition.java | 7 ++++--- .../condition/ConditionalOnMissingBeanTests.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index e2287e3455..1f5032967a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -67,6 +67,7 @@ import org.springframework.util.StringUtils; * @author Jakub Kubrynski * @author Stephane Nicoll * @author Andy Wilkinson + * @author Jorge Cordoba * @see ConditionalOnBean * @see ConditionalOnMissingBean * @see ConditionalOnSingleCandidate @@ -387,7 +388,7 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat private final ClassLoader classLoader; - private final Class annotationType; + private final Class annotationType; private final Set names; @@ -581,11 +582,11 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat } ConditionMessage.Builder message() { - return ConditionMessage.forCondition(ConditionalOnBean.class, this); + return ConditionMessage.forCondition(this.annotationType, this); } ConditionMessage.Builder message(ConditionMessage message) { - return message.andCondition(ConditionalOnBean.class, this); + return message.andCondition(this.annotationType, this); } @Override diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java index 9a24b37c29..7013b87983 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java @@ -21,6 +21,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.Collection; import java.util.Date; import java.util.function.Consumer; @@ -57,6 +58,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb * @author Jakub Kubrynski * @author Andy Wilkinson + * @author Jorge Cordoba */ @SuppressWarnings("resource") public class ConditionalOnMissingBeanTests { @@ -135,6 +137,16 @@ public class ConditionalOnMissingBeanTests { assertThat(context.getBean("foo")).isEqualTo("foo"); }); } + @Test + void testOnMissingBeanConditionOutputShouldNotContainConditionalOnBeanClassInMessage() { + this.contextRunner.withUserConfiguration(ConditionalOnMissingBeanTests.OnBeanNameConfiguration.class).run((context) -> { + Collection conditionAndOutcomes = ConditionEvaluationReport + .get(context.getSourceApplicationContext().getBeanFactory()).getConditionAndOutcomesBySource() + .values(); + String message = conditionAndOutcomes.iterator().next().iterator().next().getOutcome().getMessage(); + assertThat(message).doesNotContain("@ConditionalOnBean (names: foo; SearchStrategy: all) did not find any beans"); + }); + } @Test void testOnMissingBeanConditionWithFactoryBean() { From 66809c6c1e2c36e12981419c2f26aa493a45e658 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 11 Feb 2020 09:25:48 +0100 Subject: [PATCH 2/2] Polish "Fix condition source in OnBeanCondition" See gh-19948 --- .../autoconfigure/condition/OnBeanCondition.java | 3 +-- .../condition/ConditionalOnBeanTests.java | 13 +++++++++++++ .../condition/ConditionalOnMissingBeanTests.java | 8 ++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index 1f5032967a..4f774c7ed3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,7 +67,6 @@ import org.springframework.util.StringUtils; * @author Jakub Kubrynski * @author Stephane Nicoll * @author Andy Wilkinson - * @author Jorge Cordoba * @see ConditionalOnBean * @see ConditionalOnMissingBean * @see ConditionalOnSingleCandidate diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java index b588ccfe8c..6f6a0d428b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java @@ -21,6 +21,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.Collection; import java.util.Date; import java.util.function.Consumer; @@ -29,6 +30,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcomes; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.ConfigurableApplicationContext; @@ -134,6 +136,17 @@ class ConditionalOnBeanTests { assertThat(context.getBean("bar")).isEqualTo("bar"); } + @Test + void onBeanConditionOutputShouldNotContainConditionalOnMissingBeanClassInMessage() { + this.contextRunner.withUserConfiguration(OnBeanNameConfiguration.class).run((context) -> { + Collection conditionAndOutcomes = ConditionEvaluationReport + .get(context.getSourceApplicationContext().getBeanFactory()).getConditionAndOutcomesBySource() + .values(); + String message = conditionAndOutcomes.iterator().next().iterator().next().getOutcome().getMessage(); + assertThat(message).doesNotContain("@ConditionalOnMissingBean"); + }); + } + @Test void conditionEvaluationConsidersChangeInTypeWhenBeanIsOverridden() { this.contextRunner.withUserConfiguration(OriginalDefinition.class, OverridingDefinition.class, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java index 7013b87983..86a85cc398 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,6 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb * @author Jakub Kubrynski * @author Andy Wilkinson - * @author Jorge Cordoba */ @SuppressWarnings("resource") public class ConditionalOnMissingBeanTests { @@ -137,14 +136,15 @@ public class ConditionalOnMissingBeanTests { assertThat(context.getBean("foo")).isEqualTo("foo"); }); } + @Test void testOnMissingBeanConditionOutputShouldNotContainConditionalOnBeanClassInMessage() { - this.contextRunner.withUserConfiguration(ConditionalOnMissingBeanTests.OnBeanNameConfiguration.class).run((context) -> { + this.contextRunner.withUserConfiguration(OnBeanNameConfiguration.class).run((context) -> { Collection conditionAndOutcomes = ConditionEvaluationReport .get(context.getSourceApplicationContext().getBeanFactory()).getConditionAndOutcomesBySource() .values(); String message = conditionAndOutcomes.iterator().next().iterator().next().getOutcome().getMessage(); - assertThat(message).doesNotContain("@ConditionalOnBean (names: foo; SearchStrategy: all) did not find any beans"); + assertThat(message).doesNotContain("@ConditionalOnBean"); }); }