Skip to content

Commit 5318665

Browse files
committed
Merge branch '3.2.x' into 3.3.x
Closes gh-42944
2 parents 1ad5fb8 + 1c61e59 commit 5318665

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@
2424
import java.nio.file.StandardOpenOption;
2525
import java.util.Collections;
2626
import java.util.List;
27+
import java.util.Map;
2728
import java.util.Objects;
2829
import java.util.function.Supplier;
2930
import java.util.stream.Collectors;
3031

3132
import com.tngtech.archunit.base.DescribedPredicate;
33+
import com.tngtech.archunit.core.domain.JavaAnnotation;
3234
import com.tngtech.archunit.core.domain.JavaCall;
3335
import com.tngtech.archunit.core.domain.JavaClass;
3436
import com.tngtech.archunit.core.domain.JavaClass.Predicates;
3537
import com.tngtech.archunit.core.domain.JavaClasses;
3638
import com.tngtech.archunit.core.domain.JavaMethod;
3739
import com.tngtech.archunit.core.domain.JavaParameter;
40+
import com.tngtech.archunit.core.domain.JavaType;
3841
import com.tngtech.archunit.core.domain.properties.CanBeAnnotated;
3942
import com.tngtech.archunit.core.domain.properties.HasName;
4043
import com.tngtech.archunit.core.domain.properties.HasOwner.Predicates.With;
@@ -90,7 +93,8 @@ public ArchitectureCheck() {
9093
noClassesShouldConfigureDefaultStepVerifierTimeout(), noClassesShouldCallCollectorsToList(),
9194
noClassesShouldCallURLEncoderWithStringEncoding(), noClassesShouldCallURLDecoderWithStringEncoding(),
9295
noClassesShouldLoadResourcesUsingResourceUtils(), noClassesShouldCallStringToUpperCaseWithoutLocale(),
93-
noClassesShouldCallStringToLowerCaseWithoutLocale());
96+
noClassesShouldCallStringToLowerCaseWithoutLocale(),
97+
conditionalOnMissingBeanShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodReturnType());
9498
getRules().addAll(getProhibitObjectsRequireNonNull()
9599
.map((prohibit) -> prohibit ? noClassesShouldCallObjectsRequireNonNull() : Collections.emptyList()));
96100
getRuleDescriptions().set(getRules().map((rules) -> rules.stream().map(ArchRule::getDescription).toList()));
@@ -263,6 +267,36 @@ private List<ArchRule> noClassesShouldCallObjectsRequireNonNull() {
263267
.because("org.springframework.utils.Assert.notNull(Object, Supplier) should be used instead"));
264268
}
265269

270+
private ArchRule conditionalOnMissingBeanShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodReturnType() {
271+
return ArchRuleDefinition.methods()
272+
.that()
273+
.areAnnotatedWith("org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean")
274+
.should(notSpecifyOnlyATypeThatIsTheSameAsTheMethodReturnType())
275+
.allowEmptyShould(true);
276+
}
277+
278+
private ArchCondition<? super JavaMethod> notSpecifyOnlyATypeThatIsTheSameAsTheMethodReturnType() {
279+
return new ArchCondition<>("not specify only a type that is the same as the method's return type") {
280+
281+
@Override
282+
public void check(JavaMethod item, ConditionEvents events) {
283+
JavaAnnotation<JavaMethod> conditional = item
284+
.getAnnotationOfType("org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean");
285+
Map<String, Object> properties = conditional.getProperties();
286+
if (!properties.containsKey("type") && !properties.containsKey("name")) {
287+
conditional.get("value").ifPresent((value) -> {
288+
JavaType[] types = (JavaType[]) value;
289+
if (types.length == 1 && item.getReturnType().equals(types[0])) {
290+
events.add(SimpleConditionEvent.violated(item, conditional.getDescription()
291+
+ " should not specify only a value that is the same as the method's return type"));
292+
}
293+
});
294+
}
295+
}
296+
297+
};
298+
}
299+
266300
public void setClasses(FileCollection classes) {
267301
this.classes = classes;
268302
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ ExampleBean createExampleBean() {
506506
static class ConditionalOnIgnoredSubclass {
507507

508508
@Bean
509-
@ConditionalOnMissingBean(value = ExampleBean.class, ignored = CustomExampleBean.class)
509+
@ConditionalOnMissingBean(ignored = CustomExampleBean.class)
510510
ExampleBean exampleBean() {
511511
return new ExampleBean("test");
512512
}
@@ -517,7 +517,7 @@ ExampleBean exampleBean() {
517517
static class ConditionalOnIgnoredSubclassByName {
518518

519519
@Bean
520-
@ConditionalOnMissingBean(value = ExampleBean.class,
520+
@ConditionalOnMissingBean(
521521
ignoredType = "org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBeanTests$CustomExampleBean")
522522
ExampleBean exampleBean() {
523523
return new ExampleBean("test");
@@ -701,8 +701,7 @@ TestParameterizedContainer<CustomExampleBean> customExampleBean() {
701701
static class ParameterizedConditionWithValueConfig {
702702

703703
@Bean
704-
@ConditionalOnMissingBean(value = CustomExampleBean.class,
705-
parameterizedContainer = TestParameterizedContainer.class)
704+
@ConditionalOnMissingBean(parameterizedContainer = TestParameterizedContainer.class)
706705
CustomExampleBean conditionalCustomExampleBean() {
707706
return new CustomExampleBean();
708707
}

0 commit comments

Comments
 (0)