Consistent use of ResolvableType.toClass() for assignability checks
Issue: SPR-17086
This commit is contained in:
parent
3a66927bd2
commit
40148c0560
|
@ -1093,8 +1093,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
|||
ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) throws BeansException {
|
||||
|
||||
Assert.notNull(requiredType, "Required type must not be null");
|
||||
Class<?> clazz = requiredType.getRawClass();
|
||||
Assert.notNull(clazz, "Required type must have a raw Class");
|
||||
String[] candidateNames = getBeanNamesForType(requiredType);
|
||||
|
||||
if (candidateNames.length > 1) {
|
||||
|
@ -1111,7 +1109,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
|||
|
||||
if (candidateNames.length == 1) {
|
||||
String beanName = candidateNames[0];
|
||||
return new NamedBeanHolder<>(beanName, (T) getBean(beanName, clazz, args));
|
||||
return new NamedBeanHolder<>(beanName, (T) getBean(beanName, requiredType.toClass(), args));
|
||||
}
|
||||
else if (candidateNames.length > 1) {
|
||||
Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length);
|
||||
|
@ -1124,14 +1122,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
|||
candidates.put(beanName, getType(beanName));
|
||||
}
|
||||
}
|
||||
String candidateName = determinePrimaryCandidate(candidates, clazz);
|
||||
String candidateName = determinePrimaryCandidate(candidates, requiredType.toClass());
|
||||
if (candidateName == null) {
|
||||
candidateName = determineHighestPriorityCandidate(candidates, clazz);
|
||||
candidateName = determineHighestPriorityCandidate(candidates, requiredType.toClass());
|
||||
}
|
||||
if (candidateName != null) {
|
||||
Object beanInstance = candidates.get(candidateName);
|
||||
if (beanInstance == null || beanInstance instanceof Class) {
|
||||
beanInstance = getBean(candidateName, clazz, args);
|
||||
beanInstance = getBean(candidateName, requiredType.toClass(), args);
|
||||
}
|
||||
return new NamedBeanHolder<>(candidateName, (T) beanInstance);
|
||||
}
|
||||
|
|
|
@ -148,8 +148,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
|||
if (declaredEventType.isAssignableFrom(eventType)) {
|
||||
return true;
|
||||
}
|
||||
Class<?> eventClass = eventType.getRawClass();
|
||||
if (eventClass != null && PayloadApplicationEvent.class.isAssignableFrom(eventClass)) {
|
||||
if (PayloadApplicationEvent.class.isAssignableFrom(eventType.toClass())) {
|
||||
ResolvableType payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric();
|
||||
if (declaredEventType.isAssignableFrom(payloadType)) {
|
||||
return true;
|
||||
|
@ -202,8 +201,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
|||
if (this.method.getParameterCount() == 0) {
|
||||
return new Object[0];
|
||||
}
|
||||
Class<?> eventClass = declaredEventType.getRawClass();
|
||||
if ((eventClass == null || !ApplicationEvent.class.isAssignableFrom(eventClass)) &&
|
||||
if (!ApplicationEvent.class.isAssignableFrom(declaredEventType.toClass()) &&
|
||||
event instanceof PayloadApplicationEvent) {
|
||||
return new Object[] {((PayloadApplicationEvent) event).getPayload()};
|
||||
}
|
||||
|
@ -358,12 +356,12 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
|||
}
|
||||
}
|
||||
for (ResolvableType declaredEventType : this.declaredEventTypes) {
|
||||
Class<?> eventClass = declaredEventType.getRawClass();
|
||||
if ((eventClass == null || !ApplicationEvent.class.isAssignableFrom(eventClass)) &&
|
||||
Class<?> eventClass = declaredEventType.toClass();
|
||||
if (!ApplicationEvent.class.isAssignableFrom(eventClass) &&
|
||||
payloadType != null && declaredEventType.isAssignableFrom(payloadType)) {
|
||||
return declaredEventType;
|
||||
}
|
||||
if (eventClass != null && eventClass.isInstance(event)) {
|
||||
if (eventClass.isInstance(event)) {
|
||||
return declaredEventType;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@ import org.springframework.util.MimeTypeUtils;
|
|||
*/
|
||||
public class ByteArrayDecoder extends AbstractDataBufferDecoder<byte[]> {
|
||||
|
||||
|
||||
public ByteArrayDecoder() {
|
||||
super(MimeTypeUtils.ALL);
|
||||
}
|
||||
|
@ -42,8 +41,7 @@ public class ByteArrayDecoder extends AbstractDataBufferDecoder<byte[]> {
|
|||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
Class<?> clazz = elementType.getRawClass();
|
||||
return (super.canDecode(elementType, mimeType) && byte[].class == clazz);
|
||||
return (elementType.resolve() == byte[].class && super.canDecode(elementType, mimeType));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -36,7 +36,6 @@ import org.springframework.util.MimeTypeUtils;
|
|||
*/
|
||||
public class ByteBufferDecoder extends AbstractDataBufferDecoder<ByteBuffer> {
|
||||
|
||||
|
||||
public ByteBufferDecoder() {
|
||||
super(MimeTypeUtils.ALL);
|
||||
}
|
||||
|
@ -44,8 +43,8 @@ public class ByteBufferDecoder extends AbstractDataBufferDecoder<ByteBuffer> {
|
|||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
Class<?> clazz = elementType.getRawClass();
|
||||
return (super.canDecode(elementType, mimeType) && clazz != null && ByteBuffer.class.isAssignableFrom(clazz));
|
||||
return (ByteBuffer.class.isAssignableFrom(elementType.toClass()) &&
|
||||
super.canDecode(elementType, mimeType));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -45,7 +45,6 @@ import org.springframework.util.MimeTypeUtils;
|
|||
*/
|
||||
public class DataBufferDecoder extends AbstractDataBufferDecoder<DataBuffer> {
|
||||
|
||||
|
||||
public DataBufferDecoder() {
|
||||
super(MimeTypeUtils.ALL);
|
||||
}
|
||||
|
@ -53,9 +52,8 @@ public class DataBufferDecoder extends AbstractDataBufferDecoder<DataBuffer> {
|
|||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
Class<?> clazz = elementType.getRawClass();
|
||||
return (super.canDecode(elementType, mimeType) &&
|
||||
clazz != null && DataBuffer.class.isAssignableFrom(clazz));
|
||||
return (DataBuffer.class.isAssignableFrom(elementType.toClass()) &&
|
||||
super.canDecode(elementType, mimeType));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -29,7 +29,6 @@ import org.springframework.core.io.Resource;
|
|||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.MimeType;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
|
||||
|
@ -42,7 +41,6 @@ import org.springframework.util.MimeTypeUtils;
|
|||
*/
|
||||
public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
|
||||
|
||||
|
||||
public ResourceDecoder() {
|
||||
super(MimeTypeUtils.ALL);
|
||||
}
|
||||
|
@ -50,8 +48,8 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
|
|||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
Class<?> clazz = elementType.getRawClass();
|
||||
return clazz != null && Resource.class.isAssignableFrom(clazz) && super.canDecode(elementType, mimeType);
|
||||
return (Resource.class.isAssignableFrom(elementType.toClass()) &&
|
||||
super.canDecode(elementType, mimeType));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -69,14 +67,12 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
|
|||
dataBuffer.read(bytes);
|
||||
DataBufferUtils.release(dataBuffer);
|
||||
|
||||
Class<?> clazz = elementType.getRawClass();
|
||||
Assert.state(clazz != null, "No resource class");
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(Hints.getLogPrefix(hints) + "Read " + bytes.length + " bytes");
|
||||
}
|
||||
|
||||
if (InputStreamResource.class == clazz) {
|
||||
Class<?> clazz = elementType.toClass();
|
||||
if (clazz == InputStreamResource.class) {
|
||||
return new InputStreamResource(new ByteArrayInputStream(bytes));
|
||||
}
|
||||
else if (Resource.class.isAssignableFrom(clazz)) {
|
||||
|
|
|
@ -64,7 +64,7 @@ public final class StringDecoder extends AbstractDataBufferDecoder<String> {
|
|||
public static final List<String> DEFAULT_DELIMITERS = Arrays.asList("\r\n", "\n");
|
||||
|
||||
private static final List<byte[]> DEFAULT_DELIMITER_BYTES = DEFAULT_DELIMITERS.stream()
|
||||
.map(s -> s.getBytes(StandardCharsets.UTF_8))
|
||||
.map(str -> str.getBytes(StandardCharsets.UTF_8))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
|
||||
|
@ -83,8 +83,7 @@ public final class StringDecoder extends AbstractDataBufferDecoder<String> {
|
|||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
return (super.canDecode(elementType, mimeType) &&
|
||||
String.class.equals(elementType.getRawClass()));
|
||||
return (elementType.resolve() == String.class && super.canDecode(elementType, mimeType));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -105,8 +105,7 @@ public class FormHttpMessageWriter extends LoggingCodecSupport
|
|||
|
||||
@Override
|
||||
public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) {
|
||||
Class<?> rawClass = elementType.getRawClass();
|
||||
if (rawClass == null || !MultiValueMap.class.isAssignableFrom(rawClass)) {
|
||||
if (!MultiValueMap.class.isAssignableFrom(elementType.toClass())) {
|
||||
return false;
|
||||
}
|
||||
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) {
|
||||
|
|
|
@ -93,14 +93,13 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
|||
}
|
||||
|
||||
private boolean isServerSentEvent(ResolvableType elementType) {
|
||||
Class<?> rawClass = elementType.getRawClass();
|
||||
return (rawClass != null && ServerSentEvent.class.isAssignableFrom(rawClass));
|
||||
return ServerSentEvent.class.isAssignableFrom(elementType.toClass());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Flux<Object> read(ResolvableType elementType, ReactiveHttpInputMessage message,
|
||||
Map<String, Object> hints) {
|
||||
public Flux<Object> read(
|
||||
ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) {
|
||||
|
||||
boolean shouldWrap = isServerSentEvent(elementType);
|
||||
ResolvableType valueType = (shouldWrap ? elementType.getGeneric() : elementType);
|
||||
|
@ -170,13 +169,13 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
|||
}
|
||||
|
||||
@Override
|
||||
public Mono<Object> readMono(ResolvableType elementType, ReactiveHttpInputMessage message,
|
||||
Map<String, Object> hints) {
|
||||
public Mono<Object> readMono(
|
||||
ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) {
|
||||
|
||||
// We're ahead of String + "*/*"
|
||||
// Let's see if we can aggregate the output (lest we time out)...
|
||||
|
||||
if (String.class.equals(elementType.getRawClass())) {
|
||||
if (elementType.resolve() == String.class) {
|
||||
Flux<DataBuffer> body = message.getBody();
|
||||
return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class);
|
||||
}
|
||||
|
|
|
@ -113,8 +113,7 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter<Objec
|
|||
private Flux<Publisher<DataBuffer>> encode(Publisher<?> input, ResolvableType elementType,
|
||||
MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) {
|
||||
|
||||
Class<?> elementClass = elementType.getRawClass();
|
||||
ResolvableType valueType = (elementClass != null && ServerSentEvent.class.isAssignableFrom(elementClass) ?
|
||||
ResolvableType valueType = (ServerSentEvent.class.isAssignableFrom(elementType.toClass()) ?
|
||||
elementType.getGeneric() : elementType);
|
||||
|
||||
return Flux.from(input).map(element -> {
|
||||
|
|
|
@ -177,10 +177,9 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
|
|||
|
||||
@Override
|
||||
public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) {
|
||||
Class<?> rawClass = elementType.getRawClass();
|
||||
return rawClass != null && MultiValueMap.class.isAssignableFrom(rawClass) &&
|
||||
return (MultiValueMap.class.isAssignableFrom(elementType.toClass()) &&
|
||||
(mediaType == null ||
|
||||
this.supportedMediaTypes.stream().anyMatch(m -> m.isCompatibleWith(mediaType)));
|
||||
this.supportedMediaTypes.stream().anyMatch(element -> element.isCompatibleWith(mediaType))));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -281,7 +280,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
|
|||
if (body instanceof Resource) {
|
||||
outputHeaders.setContentDispositionFormData(name, ((Resource) body).getFilename());
|
||||
}
|
||||
else if (Resource.class.equals(resolvableType.getRawClass())) {
|
||||
else if (resolvableType.resolve() == Resource.class) {
|
||||
body = (T) Mono.from((Publisher<?>) body).doOnNext(o -> outputHeaders
|
||||
.setContentDispositionFormData(name, ((Resource) o).getFilename()));
|
||||
}
|
||||
|
|
|
@ -168,13 +168,11 @@ public class ProtobufDecoder extends ProtobufCodecSupport implements Decoder<Mes
|
|||
|
||||
private int messageBytesToRead;
|
||||
|
||||
|
||||
public MessageDecoderFunction(ResolvableType elementType, int maxMessageSize) {
|
||||
this.elementType = elementType;
|
||||
this.maxMessageSize = maxMessageSize;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Iterable<? extends Message> apply(DataBuffer input) {
|
||||
try {
|
||||
|
@ -186,13 +184,13 @@ public class ProtobufDecoder extends ProtobufCodecSupport implements Decoder<Mes
|
|||
if (this.output == null) {
|
||||
int firstByte = input.read();
|
||||
if (firstByte == -1) {
|
||||
throw new DecodingException("Can't parse message size");
|
||||
throw new DecodingException("Cannot parse message size");
|
||||
}
|
||||
this.messageBytesToRead = CodedInputStream.readRawVarint32(firstByte, input.asInputStream());
|
||||
if (this.messageBytesToRead > this.maxMessageSize) {
|
||||
throw new DecodingException(
|
||||
"The number of bytes to read parsed in the incoming stream (" +
|
||||
this.messageBytesToRead + ") exceeds the configured limit (" + this.maxMessageSize + ")");
|
||||
this.messageBytesToRead + ") exceeds the configured limit (" + this.maxMessageSize + ")");
|
||||
}
|
||||
this.output = input.factory().allocateBuffer(this.messageBytesToRead);
|
||||
}
|
||||
|
|
|
@ -84,9 +84,9 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
|
|||
@Override
|
||||
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
|
||||
if (super.canDecode(elementType, mimeType)) {
|
||||
Class<?> outputClass = elementType.getRawClass();
|
||||
return (outputClass != null && (outputClass.isAnnotationPresent(XmlRootElement.class) ||
|
||||
outputClass.isAnnotationPresent(XmlType.class)));
|
||||
Class<?> outputClass = elementType.toClass();
|
||||
return (outputClass.isAnnotationPresent(XmlRootElement.class) ||
|
||||
outputClass.isAnnotationPresent(XmlType.class));
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
|
@ -97,12 +97,10 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
|
|||
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
|
||||
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
|
||||
|
||||
Class<?> outputClass = elementType.getRawClass();
|
||||
Assert.state(outputClass != null, "Unresolvable output class");
|
||||
|
||||
Flux<XMLEvent> xmlEventFlux = this.xmlEventDecoder.decode(
|
||||
inputStream, ResolvableType.forClass(XMLEvent.class), mimeType, hints);
|
||||
|
||||
Class<?> outputClass = elementType.toClass();
|
||||
QName typeName = toQName(outputClass);
|
||||
Flux<List<XMLEvent>> splitEvents = split(xmlEventFlux, typeName);
|
||||
|
||||
|
@ -119,6 +117,7 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
|
|||
@Override
|
||||
public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
|
||||
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
|
||||
|
||||
return decode(inputStream, elementType, mimeType, hints).singleOrEmpty();
|
||||
}
|
||||
|
||||
|
|
|
@ -45,8 +45,8 @@ import org.springframework.util.MimeTypeUtils;
|
|||
* Encode from single value to a byte stream containing XML elements.
|
||||
*
|
||||
* <p>{@link javax.xml.bind.annotation.XmlElements @XmlElements} and
|
||||
* {@link javax.xml.bind.annotation.XmlElement @XmlElement} can be used to specify how
|
||||
* collections should be marshalled.
|
||||
* {@link javax.xml.bind.annotation.XmlElement @XmlElement} can be used
|
||||
* to specify how collections should be marshalled.
|
||||
*
|
||||
* @author Sebastien Deleuze
|
||||
* @author Arjen Poutsma
|
||||
|
@ -73,7 +73,6 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
|
|||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -101,8 +101,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg
|
|||
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;
|
||||
|
|
Loading…
Reference in New Issue