Skip to content

Commit c5a7521

Browse files
committed
Compare qualifier value arrays with equality semantics
Closes gh-32106
1 parent 89e7174 commit c5a7521

File tree

3 files changed

+71
-60
lines changed

3 files changed

+71
-60
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -292,7 +292,7 @@ protected boolean checkQualifier(
292292
if (actualValue != null) {
293293
actualValue = typeConverter.convertIfNecessary(actualValue, expectedValue.getClass());
294294
}
295-
if (!expectedValue.equals(actualValue)) {
295+
if (!ObjectUtils.nullSafeEquals(expectedValue, actualValue)) {
296296
return false;
297297
}
298298
}

spring-context/src/test/java/org/springframework/beans/factory/support/QualifierAnnotationAutowireContextTests.java

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ void autowiredFieldWithSingleNonQualifiedCandidate() {
6363
new RootBeanDefinition(QualifiedFieldTestBean.class));
6464
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
6565

66-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
67-
context::refresh)
68-
.satisfies(ex -> {
69-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
70-
assertThat(ex.getBeanName()).isEqualTo("autowired");
71-
});
66+
assertThatExceptionOfType(BeanCreationException.class)
67+
.isThrownBy(context::refresh)
68+
.satisfies(ex -> {
69+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
70+
assertThat(ex.getBeanName()).isEqualTo("autowired");
71+
});
7272
}
7373

7474
@Test
@@ -81,12 +81,13 @@ void autowiredMethodParameterWithSingleNonQualifiedCandidate() {
8181
context.registerBeanDefinition("autowired",
8282
new RootBeanDefinition(QualifiedMethodParameterTestBean.class));
8383
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
84-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
85-
context::refresh)
86-
.satisfies(ex -> {
87-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
88-
assertThat(ex.getBeanName()).isEqualTo("autowired");
89-
});
84+
85+
assertThatExceptionOfType(BeanCreationException.class)
86+
.isThrownBy(context::refresh)
87+
.satisfies(ex -> {
88+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
89+
assertThat(ex.getBeanName()).isEqualTo("autowired");
90+
});
9091

9192
}
9293

@@ -100,9 +101,10 @@ void autowiredConstructorArgumentWithSingleNonQualifiedCandidate() {
100101
context.registerBeanDefinition("autowired",
101102
new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class));
102103
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
103-
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
104-
context::refresh)
105-
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
104+
105+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
106+
.isThrownBy(context::refresh)
107+
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
106108
}
107109

108110
@Test
@@ -205,12 +207,13 @@ void autowiredFieldWithMultipleNonQualifiedCandidates() {
205207
context.registerBeanDefinition("autowired",
206208
new RootBeanDefinition(QualifiedFieldTestBean.class));
207209
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
208-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
209-
context::refresh)
210-
.satisfies(ex -> {
211-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
212-
assertThat(ex.getBeanName()).isEqualTo("autowired");
213-
});
210+
211+
assertThatExceptionOfType(BeanCreationException.class)
212+
.isThrownBy(context::refresh)
213+
.satisfies(ex -> {
214+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
215+
assertThat(ex.getBeanName()).isEqualTo("autowired");
216+
});
214217
}
215218

216219
@Test
@@ -227,12 +230,13 @@ void autowiredMethodParameterWithMultipleNonQualifiedCandidates() {
227230
context.registerBeanDefinition("autowired",
228231
new RootBeanDefinition(QualifiedMethodParameterTestBean.class));
229232
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
230-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
231-
context::refresh)
232-
.satisfies(ex -> {
233-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
234-
assertThat(ex.getBeanName()).isEqualTo("autowired");
235-
});
233+
234+
assertThatExceptionOfType(BeanCreationException.class)
235+
.isThrownBy(context::refresh)
236+
.satisfies(ex -> {
237+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
238+
assertThat(ex.getBeanName()).isEqualTo("autowired");
239+
});
236240
}
237241

238242
@Test
@@ -249,9 +253,10 @@ void autowiredConstructorArgumentWithMultipleNonQualifiedCandidates() {
249253
context.registerBeanDefinition("autowired",
250254
new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class));
251255
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
252-
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
253-
context::refresh)
254-
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
256+
257+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
258+
.isThrownBy(context::refresh)
259+
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
255260
}
256261

257262
@Test
@@ -374,12 +379,13 @@ void autowiredFieldDoesNotResolveCandidateWithDefaultValueAndConflictingValueOnB
374379
context.registerBeanDefinition("autowired",
375380
new RootBeanDefinition(QualifiedFieldWithDefaultValueTestBean.class));
376381
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
377-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
378-
context::refresh)
379-
.satisfies(ex -> {
380-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
381-
assertThat(ex.getBeanName()).isEqualTo("autowired");
382-
});
382+
383+
assertThatExceptionOfType(BeanCreationException.class)
384+
.isThrownBy(context::refresh)
385+
.satisfies(ex -> {
386+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
387+
assertThat(ex.getBeanName()).isEqualTo("autowired");
388+
});
383389
}
384390

385391
@Test
@@ -451,12 +457,13 @@ void autowiredFieldDoesNotResolveWithMultipleQualifierValuesAndConflictingDefaul
451457
context.registerBeanDefinition("autowired",
452458
new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class));
453459
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
454-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
455-
context::refresh)
456-
.satisfies(ex -> {
457-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
458-
assertThat(ex.getBeanName()).isEqualTo("autowired");
459-
});
460+
461+
assertThatExceptionOfType(BeanCreationException.class)
462+
.isThrownBy(context::refresh)
463+
.satisfies(ex -> {
464+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
465+
assertThat(ex.getBeanName()).isEqualTo("autowired");
466+
});
460467
}
461468

462469
@Test
@@ -507,12 +514,13 @@ void autowiredFieldDoesNotResolveWithMultipleQualifierValuesAndMultipleMatchingC
507514
context.registerBeanDefinition("autowired",
508515
new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class));
509516
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
510-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
511-
context::refresh)
512-
.satisfies(ex -> {
513-
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
514-
assertThat(ex.getBeanName()).isEqualTo("autowired");
515-
});
517+
518+
assertThatExceptionOfType(BeanCreationException.class)
519+
.isThrownBy(context::refresh)
520+
.satisfies(ex -> {
521+
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
522+
assertThat(ex.getBeanName()).isEqualTo("autowired");
523+
});
516524
}
517525

518526
@Test
@@ -574,9 +582,10 @@ void autowiredFieldDoesNotResolveWithBaseQualifierAndNonDefaultValueAndMultipleM
574582
context.registerBeanDefinition("autowired",
575583
new RootBeanDefinition(QualifiedConstructorArgumentWithBaseQualifierNonDefaultValueTestBean.class));
576584
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
577-
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
578-
context::refresh)
579-
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
585+
586+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
587+
.isThrownBy(context::refresh)
588+
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
580589
}
581590

582591

@@ -752,7 +761,7 @@ public DefaultValueQualifiedPerson(String name) {
752761
@Qualifier
753762
@interface TestQualifierWithMultipleAttributes {
754763

755-
String value() default "default";
764+
String[] value() default "default";
756765

757766
int number();
758767
}

spring-context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ void testNonQualifiedFieldFails() {
5858
BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
5959
reader.loadBeanDefinitions(CONFIG_LOCATION);
6060
context.registerSingleton("testBean", NonQualifiedTestBean.class);
61-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
62-
context::refresh)
63-
.withMessageContaining("found 6");
61+
62+
assertThatExceptionOfType(BeanCreationException.class)
63+
.isThrownBy(context::refresh)
64+
.withMessageContaining("found 6");
6465
}
6566

6667
@Test
@@ -192,9 +193,10 @@ void testQualifiedByAttributesFailsWithoutCustomQualifierRegistered() {
192193
BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
193194
reader.loadBeanDefinitions(CONFIG_LOCATION);
194195
context.registerSingleton("testBean", QualifiedByAttributesTestBean.class);
195-
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
196-
context::refresh)
197-
.withMessageContaining("found 6");
196+
197+
assertThatExceptionOfType(BeanCreationException.class)
198+
.isThrownBy(context::refresh)
199+
.withMessageContaining("found 6");
198200
}
199201

200202
@Test

0 commit comments

Comments
 (0)