From 16050ff0ba766d49a36d9a56c60acc67fa6cb374 Mon Sep 17 00:00:00 2001 From: Dekel Pilli Date: Tue, 29 Oct 2019 12:10:48 +1100 Subject: [PATCH] Fixing NPE in AbstractNamedValueMethodArgumentResolver --- .../support/AbstractNamedValueMethodArgumentResolver.java | 5 +++-- .../DestinationVariableMethodArgumentResolver.java | 2 +- .../annotation/support/HeaderMethodArgumentResolver.java | 2 +- .../support/HeaderMethodArgumentResolverTests.java | 8 ++++++++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java index afb773c8205e..09c97aff6ae3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java @@ -26,6 +26,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.handler.annotation.ValueConstants; @@ -72,10 +73,10 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * @param beanFactory a bean factory for resolving {@code ${...}} * placeholders and {@code #{...}} SpEL expressions in default values */ - protected AbstractNamedValueMethodArgumentResolver(ConversionService conversionService, + protected AbstractNamedValueMethodArgumentResolver(@Nullable ConversionService conversionService, @Nullable ConfigurableBeanFactory beanFactory) { - this.conversionService = conversionService; + this.conversionService = conversionService != null ? conversionService : DefaultConversionService.getSharedInstance(); this.configurableBeanFactory = beanFactory; this.expressionContext = (beanFactory != null ? new BeanExpressionContext(beanFactory, null) : null); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DestinationVariableMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DestinationVariableMethodArgumentResolver.java index ad80d5922dc1..e0e4e16e0b7e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DestinationVariableMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DestinationVariableMethodArgumentResolver.java @@ -41,7 +41,7 @@ public class DestinationVariableMethodArgumentResolver extends AbstractNamedValu DestinationVariableMethodArgumentResolver.class.getSimpleName() + ".templateVariables"; - public DestinationVariableMethodArgumentResolver(ConversionService conversionService) { + public DestinationVariableMethodArgumentResolver(@Nullable ConversionService conversionService) { super(conversionService, null); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java index e6b50f058631..a3a21d53016c 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java @@ -49,7 +49,7 @@ public class HeaderMethodArgumentResolver extends AbstractNamedValueMethodArgume public HeaderMethodArgumentResolver( - ConversionService conversionService, @Nullable ConfigurableBeanFactory beanFactory) { + @Nullable ConversionService conversionService, @Nullable ConfigurableBeanFactory beanFactory) { super(conversionService, beanFactory); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolverTests.java b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolverTests.java index 503ef454ed82..fcc4772a070d 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolverTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolverTests.java @@ -145,6 +145,14 @@ public void resolveOptionalHeaderWithValue() throws Exception { assertThat(result).isEqualTo(Optional.of("bar")); } + @Test + public void resolveOptionalHeaderWithValueFromNullConversionServiceInput() throws Exception { + GenericApplicationContext context = new GenericApplicationContext(); + context.refresh(); + resolver = new HeaderMethodArgumentResolver(null, context.getBeanFactory()); + resolveOptionalHeaderWithValue(); + } + @Test public void resolveOptionalHeaderAsEmpty() throws Exception { Message message = MessageBuilder.withPayload("foo").build();