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 dc8e877c589..5f9b64c20e1 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,6 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; 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; @@ -61,8 +60,10 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle private final ConversionService conversionService; + @Nullable private final ConfigurableBeanFactory configurableBeanFactory; + @Nullable private final BeanExpressionContext expressionContext; private final Map namedValueInfoCache = new ConcurrentHashMap<>(256); @@ -70,16 +71,16 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle /** * Constructor with a {@link ConversionService} and a {@link BeanFactory}. - * @param cs conversion service for converting values to match the + * @param conversionService conversion service for converting values to match the * target method parameter type * @param beanFactory a bean factory to use for resolving {@code ${...}} placeholder * and {@code #{...}} SpEL expressions in default values, or {@code null} if default * values are not expected to contain expressions */ - protected AbstractNamedValueMethodArgumentResolver(ConversionService cs, + protected AbstractNamedValueMethodArgumentResolver(ConversionService conversionService, @Nullable ConfigurableBeanFactory beanFactory) { - this.conversionService = (cs != null ? cs : DefaultConversionService.getSharedInstance()); + this.conversionService = conversionService; this.configurableBeanFactory = beanFactory; this.expressionContext = (beanFactory != null ? new BeanExpressionContext(beanFactory, null) : null); } @@ -161,8 +162,9 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * Resolve the given annotation-specified value, * potentially containing placeholders and expressions. */ + @Nullable private Object resolveStringValue(String value) { - if (this.configurableBeanFactory == null) { + if (this.configurableBeanFactory == null || this.expressionContext == null) { return value; } String placeholdersResolved = this.configurableBeanFactory.resolveEmbeddedValue(value); @@ -199,6 +201,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * A {@code null} results in a {@code false} value for {@code boolean}s or an * exception for other primitives. */ + @Nullable private Object handleNullValue(String name, @Nullable Object value, Class paramType) { if (value == null) { if (Boolean.TYPE.equals(paramType)) { @@ -221,7 +224,8 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * @param parameter the argument parameter type * @param message the message */ - protected void handleResolvedValue(Object arg, String name, MethodParameter parameter, Message message) { + protected void handleResolvedValue( + @Nullable Object arg, String name, MethodParameter parameter, Message message) { } @@ -235,9 +239,10 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle private final boolean required; + @Nullable private final String defaultValue; - protected NamedValueInfo(String name, boolean required, String defaultValue) { + protected NamedValueInfo(String name, boolean required, @Nullable String defaultValue) { this.name = name; this.required = required; this.defaultValue = defaultValue; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java index 3b33d97096b..43d6cbd29c0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,11 +26,13 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.convert.ConversionService; import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.lang.Nullable; import org.springframework.messaging.converter.GenericMessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; +import org.springframework.util.Assert; import org.springframework.validation.Validator; /** @@ -60,15 +62,19 @@ public class DefaultMessageHandlerMethodFactory private ConversionService conversionService = new DefaultFormattingConversionService(); + @Nullable private MessageConverter messageConverter; + @Nullable private Validator validator; + @Nullable private List customArgumentResolvers; private final HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite(); + @Nullable private BeanFactory beanFactory; @@ -114,6 +120,7 @@ public class DefaultMessageHandlerMethodFactory * the ones configured by default. This is an advanced option. For most use cases * it should be sufficient to use {@link #setCustomArgumentResolvers(java.util.List)}. */ + @SuppressWarnings("ConstantConditions") public void setArgumentResolvers(List argumentResolvers) { if (argumentResolvers == null) { this.argumentResolvers.clear(); @@ -151,11 +158,11 @@ public class DefaultMessageHandlerMethodFactory protected List initArgumentResolvers() { List resolvers = new ArrayList<>(); - ConfigurableBeanFactory cbf = (this.beanFactory instanceof ConfigurableBeanFactory ? + ConfigurableBeanFactory beanFactory = (this.beanFactory instanceof ConfigurableBeanFactory ? (ConfigurableBeanFactory) this.beanFactory : null); // Annotation-based argument resolution - resolvers.add(new HeaderMethodArgumentResolver(this.conversionService, cbf)); + resolvers.add(new HeaderMethodArgumentResolver(this.conversionService, beanFactory)); resolvers.add(new HeadersMethodArgumentResolver()); // Type-based argument resolution @@ -164,6 +171,8 @@ public class DefaultMessageHandlerMethodFactory if (this.customArgumentResolvers != null) { resolvers.addAll(this.customArgumentResolvers); } + + Assert.notNull(this.messageConverter, "MessageConverter not configured"); resolvers.add(new PayloadArgumentResolver(this.messageConverter, this.validator)); return resolvers; 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 b1c3b6b34d2..d9bad3db433 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,8 +43,8 @@ public class DestinationVariableMethodArgumentResolver extends AbstractNamedValu DestinationVariableMethodArgumentResolver.class.getSimpleName() + ".templateVariables"; - public DestinationVariableMethodArgumentResolver(ConversionService cs) { - super(cs, null); + public DestinationVariableMethodArgumentResolver(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 679db8c9b0e..8e2e72d29ab 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,8 +43,10 @@ public class HeaderMethodArgumentResolver extends AbstractNamedValueMethodArgume private static final Log logger = LogFactory.getLog(HeaderMethodArgumentResolver.class); - public HeaderMethodArgumentResolver(ConversionService cs, ConfigurableBeanFactory beanFactory) { - super(cs, beanFactory); + public HeaderMethodArgumentResolver( + ConversionService conversionService, @Nullable ConfigurableBeanFactory beanFactory) { + + super(conversionService, beanFactory); } @@ -94,9 +96,9 @@ public class HeaderMethodArgumentResolver extends AbstractNamedValueMethodArgume } @SuppressWarnings("unchecked") + @Nullable private Map> getNativeHeaders(Message message) { - return (Map>) message.getHeaders().get( - NativeMessageHeaderAccessor.NATIVE_HEADERS); + return (Map>) message.getHeaders().get(NativeMessageHeaderAccessor.NATIVE_HEADERS); } @Override diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java index d92af195ae6..337d966bc86 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import org.springframework.util.StringUtils; */ public class MessageMethodArgumentResolver implements HandlerMethodArgumentResolver { + @Nullable private final MessageConverter converter; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java index 022441df4d8..a8913b2752e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java @@ -55,6 +55,7 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { private final MessageConverter converter; + @Nullable private final Validator validator; private final boolean useDefaultResolution; @@ -76,7 +77,7 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { * @param messageConverter the MessageConverter to use (required) * @param validator the Validator to use (optional) */ - public PayloadArgumentResolver(MessageConverter messageConverter, Validator validator) { + public PayloadArgumentResolver(MessageConverter messageConverter, @Nullable Validator validator) { this(messageConverter, validator, true); } @@ -89,7 +90,7 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { * all parameters; if "false" then only arguments with the {@code @Payload} * annotation are supported. */ - public PayloadArgumentResolver(MessageConverter messageConverter, Validator validator, + public PayloadArgumentResolver(MessageConverter messageConverter, @Nullable Validator validator, boolean useDefaultResolution) { Assert.notNull(messageConverter, "MessageConverter must not be null"); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/package-info.java index 7b106d109cd..494657e5c67 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/package-info.java @@ -1,4 +1,9 @@ /** * Support classes for working with annotated message-handling methods. */ +@NonNullApi +@NonNullFields package org.springframework.messaging.handler.annotation.support; + +import org.springframework.lang.NonNullApi; +import org.springframework.lang.NonNullFields;