Consistent use of ResolvableType.toClass() for assignability checks

Issue: SPR-17086
This commit is contained in:
Juergen Hoeller
2018-11-12 20:29:37 +01:00
parent 3a66927bd2
commit 40148c0560
22 changed files with 64 additions and 94 deletions

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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;

View File

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

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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)) {