Fix overridden methods nullability

Issue: SPR-15869
This commit is contained in:
Sebastien Deleuze
2017-08-17 14:30:14 +02:00
parent 6b6c1d3e53
commit 73cf07e9a4
488 changed files with 1016 additions and 34 deletions

View File

@@ -167,11 +167,13 @@ public abstract class AbstractMessageConverter implements SmartMessageConverter
}
@Override
@Nullable
public final Object fromMessage(Message<?> message, Class<?> targetClass) {
return fromMessage(message, targetClass, null);
}
@Override
@Nullable
public final Object fromMessage(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
if (!canConvertFrom(message, targetClass)) {
return null;
@@ -184,11 +186,13 @@ public abstract class AbstractMessageConverter implements SmartMessageConverter
}
@Override
@Nullable
public final Message<?> toMessage(Object payload, @Nullable MessageHeaders headers) {
return toMessage(payload, headers, null);
}
@Override
@Nullable
public final Message<?> toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
if (!canConvertTo(payload, headers)) {
return null;

View File

@@ -51,6 +51,7 @@ public class CompositeMessageConverter implements SmartMessageConverter {
@Override
@Nullable
public Object fromMessage(Message<?> message, Class<?> targetClass) {
for (MessageConverter converter : getConverters()) {
Object result = converter.fromMessage(message, targetClass);
@@ -62,6 +63,7 @@ public class CompositeMessageConverter implements SmartMessageConverter {
}
@Override
@Nullable
public Object fromMessage(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
for (MessageConverter converter : getConverters()) {
Object result = (converter instanceof SmartMessageConverter ?
@@ -75,6 +77,7 @@ public class CompositeMessageConverter implements SmartMessageConverter {
}
@Override
@Nullable
public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers) {
for (MessageConverter converter : getConverters()) {
Message<?> result = converter.toMessage(payload, headers);
@@ -86,6 +89,7 @@ public class CompositeMessageConverter implements SmartMessageConverter {
}
@Override
@Nullable
public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
for (MessageConverter converter : getConverters()) {
Message<?> result = (converter instanceof SmartMessageConverter ?

View File

@@ -56,6 +56,7 @@ public class DefaultContentTypeResolver implements ContentTypeResolver {
@Override
@Nullable
public MimeType resolve(@Nullable MessageHeaders headers) {
if (headers == null || headers.get(MessageHeaders.CONTENT_TYPE) == null) {
return this.defaultMimeType;

View File

@@ -19,6 +19,7 @@ package org.springframework.messaging.converter;
import org.springframework.core.convert.ConversionException;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
@@ -57,6 +58,7 @@ public class GenericMessageConverter extends SimpleMessageConverter {
@Override
@Nullable
public Object fromMessage(Message<?> message, Class<?> targetClass) {
Object payload = message.getPayload();
if (this.conversionService.canConvert(payload.getClass(), targetClass)) {

View File

@@ -205,6 +205,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
}
@Override
@Nullable
protected Object convertFromInternal(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
JavaType javaType = this.objectMapper.constructType(targetClass);
Object payload = message.getPayload();

View File

@@ -36,6 +36,7 @@ import org.springframework.util.ClassUtils;
public class SimpleMessageConverter implements MessageConverter {
@Override
@Nullable
public Object fromMessage(Message<?> message, Class<?> targetClass) {
Object payload = message.getPayload();
return (ClassUtils.isAssignableValue(targetClass, payload) ? payload : null);

View File

@@ -61,6 +61,7 @@ public class StringMessageConverter extends AbstractMessageConverter {
}
@Override
@Nullable
protected Object convertToInternal(
Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {

View File

@@ -100,30 +100,35 @@ public abstract class AbstractDestinationResolvingMessagingTemplate<D> extends A
}
@Override
@Nullable
public Message<?> receive(String destinationName) {
D destination = resolveDestination(destinationName);
return super.receive(destination);
}
@Override
@Nullable
public <T> T receiveAndConvert(String destinationName, Class<T> targetClass) {
D destination = resolveDestination(destinationName);
return super.receiveAndConvert(destination, targetClass);
}
@Override
@Nullable
public Message<?> sendAndReceive(String destinationName, Message<?> requestMessage) {
D destination = resolveDestination(destinationName);
return super.sendAndReceive(destination, requestMessage);
}
@Override
@Nullable
public <T> T convertSendAndReceive(String destinationName, Object request, Class<T> targetClass) {
D destination = resolveDestination(destinationName);
return super.convertSendAndReceive(destination, request, targetClass);
}
@Override
@Nullable
public <T> T convertSendAndReceive(String destinationName, Object request,
@Nullable Map<String, Object> headers, Class<T> targetClass) {
@@ -132,6 +137,7 @@ public abstract class AbstractDestinationResolvingMessagingTemplate<D> extends A
}
@Override
@Nullable
public <T> T convertSendAndReceive(String destinationName, Object request, Class<T> targetClass,
@Nullable MessagePostProcessor postProcessor) {
@@ -140,6 +146,7 @@ public abstract class AbstractDestinationResolvingMessagingTemplate<D> extends A
}
@Override
@Nullable
public <T> T convertSendAndReceive(String destinationName, Object request,
@Nullable Map<String, Object> headers, Class<T> targetClass,
@Nullable MessagePostProcessor postProcessor) {

View File

@@ -34,11 +34,13 @@ public abstract class AbstractMessageReceivingTemplate<D> extends AbstractMessag
implements MessageReceivingOperations<D> {
@Override
@Nullable
public Message<?> receive() {
return doReceive(getRequiredDefaultDestination());
}
@Override
@Nullable
public Message<?> receive(D destination) {
return doReceive(destination);
}
@@ -54,11 +56,13 @@ public abstract class AbstractMessageReceivingTemplate<D> extends AbstractMessag
@Override
@Nullable
public <T> T receiveAndConvert(Class<T> targetClass) {
return receiveAndConvert(getRequiredDefaultDestination(), targetClass);
}
@Override
@Nullable
public <T> T receiveAndConvert(D destination, Class<T> targetClass) {
Message<?> message = doReceive(destination);
if (message != null) {

View File

@@ -34,11 +34,13 @@ public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceiv
implements MessageRequestReplyOperations<D> {
@Override
@Nullable
public Message<?> sendAndReceive(Message<?> requestMessage) {
return sendAndReceive(getRequiredDefaultDestination(), requestMessage);
}
@Override
@Nullable
public Message<?> sendAndReceive(D destination, Message<?> requestMessage) {
return doSendAndReceive(destination, requestMessage);
}
@@ -48,16 +50,19 @@ public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceiv
@Override
@Nullable
public <T> T convertSendAndReceive(Object request, Class<T> targetClass) {
return convertSendAndReceive(getRequiredDefaultDestination(), request, targetClass);
}
@Override
@Nullable
public <T> T convertSendAndReceive(D destination, Object request, Class<T> targetClass) {
return convertSendAndReceive(destination, request, null, targetClass);
}
@Override
@Nullable
public <T> T convertSendAndReceive(
D destination, Object request, @Nullable Map<String, Object> headers, Class<T> targetClass) {
@@ -65,6 +70,7 @@ public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceiv
}
@Override
@Nullable
public <T> T convertSendAndReceive(
Object request, Class<T> targetClass, @Nullable MessagePostProcessor postProcessor) {
@@ -72,6 +78,7 @@ public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceiv
}
@Override
@Nullable
public <T> T convertSendAndReceive(D destination, Object request, Class<T> targetClass,
@Nullable MessagePostProcessor postProcessor) {
@@ -80,6 +87,7 @@ public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceiv
@SuppressWarnings("unchecked")
@Override
@Nullable
public <T> T convertSendAndReceive(D destination, Object request, @Nullable Map<String, Object> headers,
Class<T> targetClass, @Nullable MessagePostProcessor postProcessor) {

View File

@@ -189,6 +189,7 @@ public class GenericMessagingTemplate extends AbstractDestinationResolvingMessag
}
@Override
@Nullable
protected final Message<?> doReceive(MessageChannel channel) {
return doReceive(channel, this.receiveTimeout);
}
@@ -209,6 +210,7 @@ public class GenericMessagingTemplate extends AbstractDestinationResolvingMessag
}
@Override
@Nullable
protected final Message<?> doSendAndReceive(MessageChannel channel, Message<?> requestMessage) {
Assert.notNull(channel, "'channel' is required");
Object originalReplyChannelHeader = requestMessage.getHeaders().getReplyChannel();
@@ -294,11 +296,13 @@ public class GenericMessagingTemplate extends AbstractDestinationResolvingMessag
}
@Override
@Nullable
public Message<?> receive() {
return this.receive(-1);
}
@Override
@Nullable
public Message<?> receive(long timeout) {
try {
if (timeout < 0) {

View File

@@ -145,6 +145,7 @@ public class DestinationPatternsMessageCondition extends AbstractMessageConditio
* or {@code null} either if a destination can not be extracted or there is no match
*/
@Override
@Nullable
public DestinationPatternsMessageCondition getMatchingCondition(Message<?> message) {
String destination = (String) message.getHeaders().get(LOOKUP_DESTINATION_HEADER);
if (destination == null) {

View File

@@ -84,6 +84,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
NamedValueInfo namedValueInfo = getNamedValueInfo(parameter);
MethodParameter nestedParameter = parameter.nestedIfOptional();

View File

@@ -20,6 +20,7 @@ import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.core.convert.ConversionService;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandlingException;
import org.springframework.messaging.handler.annotation.DestinationVariable;
@@ -55,6 +56,7 @@ public class DestinationVariableMethodArgumentResolver extends AbstractNamedValu
}
@Override
@Nullable
protected Object resolveArgumentInternal(MethodParameter parameter, Message<?> message, String name)
throws Exception {

View File

@@ -59,6 +59,7 @@ public class HeaderMethodArgumentResolver extends AbstractNamedValueMethodArgume
}
@Override
@Nullable
protected Object resolveArgumentInternal(MethodParameter parameter, Message<?> message, String name)
throws Exception {

View File

@@ -20,6 +20,7 @@ import java.lang.reflect.Method;
import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.handler.annotation.Headers;
@@ -50,6 +51,7 @@ public class HeadersMethodArgumentResolver implements HandlerMethodArgumentResol
}
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
Class<?> paramType = parameter.getParameterType();

View File

@@ -105,6 +105,7 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver {
}
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
Payload ann = parameter.getParameterAnnotation(Payload.class);
if (ann != null && StringUtils.hasText(ann.expression())) {

View File

@@ -106,6 +106,7 @@ public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgu
* @exception IllegalStateException if no suitable {@link HandlerMethodArgumentResolver} is found.
*/
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);

View File

@@ -115,6 +115,7 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet
}
@Override
@Nullable
public ListenableFuture<?> toListenableFuture(Object returnValue, MethodParameter returnType) {
HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType);
Assert.state(handler instanceof AsyncHandlerMethodReturnValueHandler,

View File

@@ -65,6 +65,7 @@ public class SimpMessageMappingInfo implements MessageCondition<SimpMessageMappi
}
@Override
@Nullable
public SimpMessageMappingInfo getMatchingCondition(Message<?> message) {
SimpMessageTypeMessageCondition typeCond = this.messageTypeMessageCondition.getMatchingCondition(message);
if (typeCond == null) {

View File

@@ -19,6 +19,7 @@ package org.springframework.messaging.simp;
import java.util.Arrays;
import java.util.Collection;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.AbstractMessageCondition;
import org.springframework.util.Assert;
@@ -71,6 +72,7 @@ public class SimpMessageTypeMessageCondition extends AbstractMessageCondition<Si
}
@Override
@Nullable
public SimpMessageTypeMessageCondition getMatchingCondition(Message<?> message) {
Object actualMessageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders());
if (actualMessageType == null) {

View File

@@ -18,6 +18,7 @@ package org.springframework.messaging.simp;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -51,6 +52,7 @@ public class SimpSessionScope implements Scope {
}
@Override
@Nullable
public Object remove(String name) {
SimpAttributes simpAttributes = SimpAttributesContextHolder.currentAttributes();
synchronized (simpAttributes.getSessionMutex()) {
@@ -71,6 +73,7 @@ public class SimpSessionScope implements Scope {
}
@Override
@Nullable
public Object resolveContextualObject(String key) {
return null;
}

View File

@@ -285,6 +285,7 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
}
@Override
@Nullable
public String resolvePlaceholder(String placeholderName) {
return (this.vars != null ? this.vars.get(placeholderName) : null);
}

View File

@@ -366,6 +366,7 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan
}
@Override
@Nullable
protected SimpMessageMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
MessageMapping messageAnn = AnnotatedElementUtils.findMergedAnnotation(method, MessageMapping.class);
if (messageAnn != null) {
@@ -438,6 +439,7 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan
}
@Override
@Nullable
protected String getDestination(Message<?> message) {
return SimpMessageHeaderAccessor.getDestination(message.getHeaders());
}
@@ -464,6 +466,7 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan
}
@Override
@Nullable
protected SimpMessageMappingInfo getMatchingMapping(SimpMessageMappingInfo mapping, Message<?> message) {
return mapping.getMatchingCondition(message);

View File

@@ -632,6 +632,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession {
}
@Override
@Nullable
public String getSubscriptionId() {
return this.headers.getId();
}

View File

@@ -181,6 +181,8 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor {
}
// Redeclared for visibility within simp.stomp
@Override
@Nullable
protected Map<String, List<String>> getNativeHeaders() {
return super.getNativeHeaders();
}

View File

@@ -399,6 +399,7 @@ public class StompHeaders implements MultiValueMap<String, String>, Serializable
* @return the first header value, or {@code null} if none
*/
@Override
@Nullable
public String getFirst(String headerName) {
List<String> headerValues = headers.get(headerName);
return headerValues != null ? headerValues.get(0) : null;

View File

@@ -120,6 +120,7 @@ public class DefaultUserDestinationResolver implements UserDestinationResolver {
@Override
@Nullable
public UserDestinationResult resolveDestination(Message<?> message) {
ParseResult parseResult = parse(message);
if (parseResult == null) {

View File

@@ -115,6 +115,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati
// SimpUserRegistry methods
@Override
@Nullable
public SimpUser getUser(String userName) {
// Prefer remote registries due to cross-server SessionLookup
for (UserRegistrySnapshot registry : this.remoteRegistries.values()) {
@@ -321,6 +322,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati
}
@Override
@Nullable
public SimpSession getSession(String sessionId) {
if (this.sessionLookup != null) {
return this.sessionLookup.findSessions(getName()).get(sessionId);

View File

@@ -35,6 +35,7 @@ class MonoToListenableFutureAdapter<T> extends AbstractMonoToListenableFutureAda
}
@Override
@Nullable
protected T adapt(@Nullable T result) {
return result;
}