Merge pull request #17215 from chenqimiao

* pr/24773:
  Polish "Improve @Autowired method injection on mixed nullability args"
  Improve @Autowired method injection on mixed nullability args

Closes gh-17215
This commit is contained in:
Stephane Nicoll
2023-08-25 12:52:36 +02:00
2 changed files with 52 additions and 1 deletions

View File

@@ -865,7 +865,7 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
descriptors[i] = currDesc;
try {
Object arg = beanFactory.resolveDependency(currDesc, beanName, autowiredBeanNames, typeConverter);
if (arg == null && !this.required) {
if (arg == null && !this.required && !methodParam.isOptional()) {
arguments = null;
break;
}

View File

@@ -32,6 +32,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.SortedMap;
@@ -2600,6 +2601,26 @@ public class AutowiredAnnotationBeanPostProcessorTests {
assertThat(bean.testBean).isSameAs(bf.getBean("annotatedBean"));
}
@Test
public void mixedNullableArgMethodInjection(){
bf.registerSingleton("nonNullBean", "Test");
bf.registerBeanDefinition("mixedNullableInjectionBean",
new RootBeanDefinition(MixedNullableInjectionBean.class));
MixedNullableInjectionBean mixedNullableInjectionBean = bf.getBean(MixedNullableInjectionBean.class);
assertThat(mixedNullableInjectionBean.nonNullBean).isNotNull();
assertThat(mixedNullableInjectionBean.nullableBean).isNull();
}
@Test
public void mixedOptionalArgMethodInjection(){
bf.registerSingleton("nonNullBean", "Test");
bf.registerBeanDefinition("mixedOptionalInjectionBean",
new RootBeanDefinition(MixedOptionalInjectionBean.class));
MixedOptionalInjectionBean mixedOptionalInjectionBean = bf.getBean(MixedOptionalInjectionBean.class);
assertThat(mixedOptionalInjectionBean.nonNullBean).isNotNull();
assertThat(mixedOptionalInjectionBean.nullableBean).isNull();
}
private <E extends UnsatisfiedDependencyException> Consumer<E> methodParameterDeclaredOn(
Class<?> expected) {
return declaredOn(
@@ -4346,4 +4367,34 @@ public class AutowiredAnnotationBeanPostProcessorTests {
}
}
static class MixedNullableInjectionBean {
@Nullable
public Integer nullableBean;
public String nonNullBean;
@Autowired(required = false)
public void nullabilityInjection(@Nullable Integer nullableBean, String nonNullBean) {
this.nullableBean = nullableBean;
this.nonNullBean = nonNullBean;
}
}
static class MixedOptionalInjectionBean {
@Nullable
public Integer nullableBean;
public String nonNullBean;
@Autowired(required = false)
public void optionalInjection(Optional<Integer> optionalBean, String nonNullBean) {
optionalBean.ifPresent(bean -> this.nullableBean = bean);
this.nonNullBean = nonNullBean;
}
}
}