Browse Source

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
pull/31115/head
Stephane Nicoll 3 years ago
parent
commit
d0fc6dd06d
  1. 2
      spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
  2. 51
      spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

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

@ -865,7 +865,7 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA @@ -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;
}

51
spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

@ -32,6 +32,7 @@ import java.util.LinkedHashMap; @@ -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 { @@ -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 { @@ -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;
}
}
}

Loading…
Cancel
Save