Compare qualifier value arrays with equality semantics

Closes gh-32106
This commit is contained in:
Juergen Hoeller 2024-01-24 22:30:28 +01:00
parent 89e7174cc4
commit c5a75219ce
3 changed files with 71 additions and 60 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2023 the original author or authors. * Copyright 2002-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -292,7 +292,7 @@ public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwa
if (actualValue != null) { if (actualValue != null) {
actualValue = typeConverter.convertIfNecessary(actualValue, expectedValue.getClass()); actualValue = typeConverter.convertIfNecessary(actualValue, expectedValue.getClass());
} }
if (!expectedValue.equals(actualValue)) { if (!ObjectUtils.nullSafeEquals(expectedValue, actualValue)) {
return false; return false;
} }
} }

View File

@ -63,12 +63,12 @@ class QualifierAnnotationAutowireContextTests {
new RootBeanDefinition(QualifiedFieldTestBean.class)); new RootBeanDefinition(QualifiedFieldTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy( assertThatExceptionOfType(BeanCreationException.class)
context::refresh) .isThrownBy(context::refresh)
.satisfies(ex -> { .satisfies(ex -> {
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getBeanName()).isEqualTo("autowired");
}); });
} }
@Test @Test
@ -81,12 +81,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedMethodParameterTestBean.class)); new RootBeanDefinition(QualifiedMethodParameterTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@ -100,9 +101,10 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class)); new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(UnsatisfiedDependencyException.class)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired")); .isThrownBy(context::refresh)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
} }
@Test @Test
@ -205,12 +207,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedFieldTestBean.class)); new RootBeanDefinition(QualifiedFieldTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@Test @Test
@ -227,12 +230,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedMethodParameterTestBean.class)); new RootBeanDefinition(QualifiedMethodParameterTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@Test @Test
@ -249,9 +253,10 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class)); new RootBeanDefinition(QualifiedConstructorArgumentTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(UnsatisfiedDependencyException.class)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired")); .isThrownBy(context::refresh)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
} }
@Test @Test
@ -374,12 +379,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedFieldWithDefaultValueTestBean.class)); new RootBeanDefinition(QualifiedFieldWithDefaultValueTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@Test @Test
@ -451,12 +457,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class)); new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@Test @Test
@ -507,12 +514,13 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class)); new RootBeanDefinition(QualifiedFieldWithMultipleAttributesTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.satisfies(ex -> { .isThrownBy(context::refresh)
assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class); .satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("autowired"); assertThat(ex.getRootCause()).isInstanceOf(NoSuchBeanDefinitionException.class);
}); assertThat(ex.getBeanName()).isEqualTo("autowired");
});
} }
@Test @Test
@ -574,9 +582,10 @@ class QualifierAnnotationAutowireContextTests {
context.registerBeanDefinition("autowired", context.registerBeanDefinition("autowired",
new RootBeanDefinition(QualifiedConstructorArgumentWithBaseQualifierNonDefaultValueTestBean.class)); new RootBeanDefinition(QualifiedConstructorArgumentWithBaseQualifierNonDefaultValueTestBean.class));
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(UnsatisfiedDependencyException.class)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired")); .isThrownBy(context::refresh)
.satisfies(ex -> assertThat(ex.getBeanName()).isEqualTo("autowired"));
} }
@ -752,7 +761,7 @@ class QualifierAnnotationAutowireContextTests {
@Qualifier @Qualifier
@interface TestQualifierWithMultipleAttributes { @interface TestQualifierWithMultipleAttributes {
String value() default "default"; String[] value() default "default";
int number(); int number();
} }

View File

@ -58,9 +58,10 @@ class QualifierAnnotationTests {
BeanDefinitionReader reader = new XmlBeanDefinitionReader(context); BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
reader.loadBeanDefinitions(CONFIG_LOCATION); reader.loadBeanDefinitions(CONFIG_LOCATION);
context.registerSingleton("testBean", NonQualifiedTestBean.class); context.registerSingleton("testBean", NonQualifiedTestBean.class);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.withMessageContaining("found 6"); .isThrownBy(context::refresh)
.withMessageContaining("found 6");
} }
@Test @Test
@ -192,9 +193,10 @@ class QualifierAnnotationTests {
BeanDefinitionReader reader = new XmlBeanDefinitionReader(context); BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
reader.loadBeanDefinitions(CONFIG_LOCATION); reader.loadBeanDefinitions(CONFIG_LOCATION);
context.registerSingleton("testBean", QualifiedByAttributesTestBean.class); context.registerSingleton("testBean", QualifiedByAttributesTestBean.class);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
context::refresh) assertThatExceptionOfType(BeanCreationException.class)
.withMessageContaining("found 6"); .isThrownBy(context::refresh)
.withMessageContaining("found 6");
} }
@Test @Test