Consistent use of ResolvableType.toClass() for assignability checks
Issue: SPR-17086
This commit is contained in:
@@ -101,20 +101,18 @@ public abstract class HandlerResultHandlerSupport implements Ordered {
|
||||
|
||||
/**
|
||||
* Get a {@code ReactiveAdapter} for the top-level return value type.
|
||||
* @return the matching adapter or {@code null}
|
||||
* @return the matching adapter, or {@code null} if none
|
||||
*/
|
||||
@Nullable
|
||||
protected ReactiveAdapter getAdapter(HandlerResult result) {
|
||||
Class<?> returnType = result.getReturnType().getRawClass();
|
||||
return getAdapterRegistry().getAdapter(returnType, result.getReturnValue());
|
||||
return getAdapterRegistry().getAdapter(result.getReturnType().resolve(), result.getReturnValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Select the best media type for the current request through a content
|
||||
* negotiation algorithm.
|
||||
* Select the best media type for the current request through a content negotiation algorithm.
|
||||
* @param exchange the current request
|
||||
* @param producibleTypesSupplier the media types that can be produced for the current request
|
||||
* @return the selected media type or {@code null}
|
||||
* @return the selected media type, or {@code null} if none
|
||||
*/
|
||||
@Nullable
|
||||
protected MediaType selectMediaType(ServerWebExchange exchange,
|
||||
|
||||
@@ -110,14 +110,13 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
|
||||
* @return indicates completion or error
|
||||
* @since 5.0.2
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
protected Mono<Void> writeBody(@Nullable Object body, MethodParameter bodyParameter,
|
||||
@Nullable MethodParameter actualParam, ServerWebExchange exchange) {
|
||||
|
||||
ResolvableType bodyType = ResolvableType.forMethodParameter(bodyParameter);
|
||||
ResolvableType actualType = (actualParam != null ? ResolvableType.forMethodParameter(actualParam) : bodyType);
|
||||
Class<?> bodyClass = bodyType.resolve();
|
||||
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(bodyClass, body);
|
||||
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(bodyType.resolve(), body);
|
||||
|
||||
Publisher<?> publisher;
|
||||
ResolvableType elementType;
|
||||
@@ -128,11 +127,11 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
|
||||
}
|
||||
else {
|
||||
publisher = Mono.justOrEmpty(body);
|
||||
elementType = ((bodyClass == null || bodyClass.equals(Object.class)) && body != null ?
|
||||
elementType = (bodyType.toClass() == Object.class && body != null ?
|
||||
ResolvableType.forInstance(body) : bodyType);
|
||||
}
|
||||
|
||||
if (void.class == elementType.getRawClass() || Void.class == elementType.getRawClass()) {
|
||||
if (elementType.resolve() == void.class || elementType.resolve() == Void.class) {
|
||||
return Mono.from((Publisher<Void>) publisher);
|
||||
}
|
||||
|
||||
|
||||
@@ -105,8 +105,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume
|
||||
if (!MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) {
|
||||
ResolvableType[] genericTypes = ResolvableType.forMethodParameter(parameter).getGenerics();
|
||||
if (genericTypes.length == 2) {
|
||||
Class<?> declaredClass = genericTypes[1].getRawClass();
|
||||
return (declaredClass == null || !List.class.isAssignableFrom(declaredClass));
|
||||
return !List.class.isAssignableFrom(genericTypes[1].toClass());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -158,9 +158,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
|
||||
}
|
||||
|
||||
if (attribute == null) {
|
||||
Class<?> attributeClass = attributeType.getRawClass();
|
||||
Assert.state(attributeClass != null, "No attribute class");
|
||||
return createAttribute(attributeName, attributeClass, context, exchange);
|
||||
return createAttribute(attributeName, attributeType.toClass(), context, exchange);
|
||||
}
|
||||
|
||||
ReactiveAdapter adapterFrom = getAdapterRegistry().getAdapter(null, attribute);
|
||||
|
||||
@@ -120,7 +120,7 @@ class ModelInitializer {
|
||||
Object value = handlerResult.getReturnValue();
|
||||
if (value != null) {
|
||||
ResolvableType type = handlerResult.getReturnType();
|
||||
ReactiveAdapter adapter = this.adapterRegistry.getAdapter(type.getRawClass(), value);
|
||||
ReactiveAdapter adapter = this.adapterRegistry.getAdapter(type.resolve(), value);
|
||||
if (isAsyncVoidType(type, adapter)) {
|
||||
return Mono.from(adapter.toPublisher(value));
|
||||
}
|
||||
@@ -131,7 +131,7 @@ class ModelInitializer {
|
||||
}
|
||||
|
||||
private boolean isAsyncVoidType(ResolvableType type, @Nullable ReactiveAdapter adapter) {
|
||||
return adapter != null && (adapter.isNoValue() || type.resolveGeneric() == Void.class);
|
||||
return (adapter != null && (adapter.isNoValue() || type.resolveGeneric() == Void.class));
|
||||
}
|
||||
|
||||
private String getAttributeName(MethodParameter param) {
|
||||
|
||||
@@ -94,9 +94,9 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand
|
||||
|
||||
@Nullable
|
||||
private static Class<?> resolveReturnValueType(HandlerResult result) {
|
||||
Class<?> valueType = result.getReturnType().getRawClass();
|
||||
Class<?> valueType = result.getReturnType().toClass();
|
||||
Object value = result.getReturnValue();
|
||||
if ((valueType == null || valueType.equals(Object.class)) && value != null) {
|
||||
if (valueType == Object.class && value != null) {
|
||||
valueType = value.getClass();
|
||||
}
|
||||
return valueType;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 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.
|
||||
@@ -151,7 +151,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport
|
||||
return true;
|
||||
}
|
||||
|
||||
Class<?> type = result.getReturnType().getRawClass();
|
||||
Class<?> type = result.getReturnType().toClass();
|
||||
ReactiveAdapter adapter = getAdapter(result);
|
||||
if (adapter != null) {
|
||||
if (adapter.isNoValue()) {
|
||||
@@ -160,11 +160,10 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport
|
||||
type = result.getReturnType().getGeneric().toClass();
|
||||
}
|
||||
|
||||
return (type != null &&
|
||||
(CharSequence.class.isAssignableFrom(type) || Rendering.class.isAssignableFrom(type) ||
|
||||
Model.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) ||
|
||||
void.class.equals(type) || View.class.isAssignableFrom(type) ||
|
||||
!BeanUtils.isSimpleProperty(type)));
|
||||
return (CharSequence.class.isAssignableFrom(type) || Rendering.class.isAssignableFrom(type) ||
|
||||
Model.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) ||
|
||||
void.class.equals(type) || View.class.isAssignableFrom(type) ||
|
||||
!BeanUtils.isSimpleProperty(type));
|
||||
}
|
||||
|
||||
private boolean hasModelAnnotation(MethodParameter parameter) {
|
||||
@@ -204,12 +203,12 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport
|
||||
MethodParameter parameter = result.getReturnTypeSource();
|
||||
Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext());
|
||||
|
||||
Class<?> clazz = valueType.getRawClass();
|
||||
if (clazz == null) {
|
||||
Class<?> clazz = valueType.toClass();
|
||||
if (clazz == Object.class) {
|
||||
clazz = returnValue.getClass();
|
||||
}
|
||||
|
||||
if (returnValue == NO_VALUE || Void.class.equals(clazz) || void.class.equals(clazz)) {
|
||||
if (returnValue == NO_VALUE || clazz == void.class || clazz == Void.class) {
|
||||
viewsMono = resolveViews(getDefaultViewName(exchange), locale);
|
||||
}
|
||||
else if (CharSequence.class.isAssignableFrom(clazz) && !hasModelAnnotation(parameter)) {
|
||||
|
||||
Reference in New Issue
Block a user