Browse Source

Consistent use of ResolvableType.toClass() for assignability checks

Issue: SPR-17086
pull/2017/head
Juergen Hoeller 6 years ago
parent
commit
40148c0560
  1. 10
      spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
  2. 12
      spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java
  3. 4
      spring-core/src/main/java/org/springframework/core/codec/ByteArrayDecoder.java
  4. 5
      spring-core/src/main/java/org/springframework/core/codec/ByteBufferDecoder.java
  5. 6
      spring-core/src/main/java/org/springframework/core/codec/DataBufferDecoder.java
  6. 12
      spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java
  7. 5
      spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java
  8. 3
      spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java
  9. 13
      spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java
  10. 3
      spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java
  11. 7
      spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java
  12. 6
      spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufDecoder.java
  13. 11
      spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlDecoder.java
  14. 5
      spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java
  15. 10
      spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java
  16. 9
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java
  17. 3
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/MatrixVariableMapMethodArgumentResolver.java
  18. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelAttributeMethodArgumentResolver.java
  19. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelInitializer.java
  20. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java
  21. 19
      spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java
  22. 3
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java

10
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

@ -1093,8 +1093,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @@ -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 @@ -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 @@ -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);
}

12
spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java

@ -148,8 +148,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe @@ -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 @@ -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 @@ -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;
}
}

4
spring-core/src/main/java/org/springframework/core/codec/ByteArrayDecoder.java

@ -34,7 +34,6 @@ import org.springframework.util.MimeTypeUtils; @@ -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[]> { @@ -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

5
spring-core/src/main/java/org/springframework/core/codec/ByteBufferDecoder.java

@ -36,7 +36,6 @@ import org.springframework.util.MimeTypeUtils; @@ -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> { @@ -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

6
spring-core/src/main/java/org/springframework/core/codec/DataBufferDecoder.java

@ -45,7 +45,6 @@ import org.springframework.util.MimeTypeUtils; @@ -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> { @@ -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

12
spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java

@ -29,7 +29,6 @@ import org.springframework.core.io.Resource; @@ -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; @@ -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> { @@ -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> { @@ -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)) {

5
spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java

@ -64,7 +64,7 @@ public final class StringDecoder extends AbstractDataBufferDecoder<String> { @@ -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> { @@ -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

3
spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java

@ -105,8 +105,7 @@ public class FormHttpMessageWriter extends LoggingCodecSupport @@ -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)) {

13
spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java

@ -93,14 +93,13 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec @@ -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 @@ -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);
}

3
spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java

@ -113,8 +113,7 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter<Objec @@ -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 -> {

7
spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java

@ -177,10 +177,9 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport @@ -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 @@ -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()));
}

6
spring-web/src/main/java/org/springframework/http/codec/protobuf/ProtobufDecoder.java

@ -168,13 +168,11 @@ public class ProtobufDecoder extends ProtobufCodecSupport implements Decoder<Mes @@ -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 @@ -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);
}

11
spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlDecoder.java

@ -84,9 +84,9 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> { @@ -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> { @@ -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> { @@ -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();
}

5
spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java

@ -45,8 +45,8 @@ import org.springframework.util.MimeTypeUtils; @@ -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> { @@ -73,7 +73,6 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
else {
return false;
}
}
@Override

10
spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java

@ -101,20 +101,18 @@ public abstract class HandlerResultHandlerSupport implements Ordered { @@ -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,

9
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java

@ -110,14 +110,13 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa @@ -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 @@ -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);
}

3
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/MatrixVariableMapMethodArgumentResolver.java

@ -105,8 +105,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume @@ -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;

4
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelAttributeMethodArgumentResolver.java

@ -158,9 +158,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR @@ -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);

4
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelInitializer.java

@ -120,7 +120,7 @@ class ModelInitializer { @@ -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 { @@ -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) {

4
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java

@ -94,9 +94,9 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand @@ -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;

19
spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java

@ -1,5 +1,5 @@ @@ -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 @@ -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 @@ -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 @@ -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)) {

3
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java

@ -101,8 +101,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg @@ -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…
Cancel
Save