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();