提交 40148c05 编写于 作者: J Juergen Hoeller

Consistent use of ResolvableType.toClass() for assignability checks

Issue: SPR-17086
上级 3a66927b
...@@ -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 { ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) throws BeansException {
Assert.notNull(requiredType, "Required type must not be null"); 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); String[] candidateNames = getBeanNamesForType(requiredType);
if (candidateNames.length > 1) { 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) { if (candidateNames.length == 1) {
String beanName = candidateNames[0]; 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) { else if (candidateNames.length > 1) {
Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length); 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)); candidates.put(beanName, getType(beanName));
} }
} }
String candidateName = determinePrimaryCandidate(candidates, clazz); String candidateName = determinePrimaryCandidate(candidates, requiredType.toClass());
if (candidateName == null) { if (candidateName == null) {
candidateName = determineHighestPriorityCandidate(candidates, clazz); candidateName = determineHighestPriorityCandidate(candidates, requiredType.toClass());
} }
if (candidateName != null) { if (candidateName != null) {
Object beanInstance = candidates.get(candidateName); Object beanInstance = candidates.get(candidateName);
if (beanInstance == null || beanInstance instanceof Class) { if (beanInstance == null || beanInstance instanceof Class) {
beanInstance = getBean(candidateName, clazz, args); beanInstance = getBean(candidateName, requiredType.toClass(), args);
} }
return new NamedBeanHolder<>(candidateName, (T) beanInstance); return new NamedBeanHolder<>(candidateName, (T) beanInstance);
} }
......
...@@ -148,8 +148,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe ...@@ -148,8 +148,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
if (declaredEventType.isAssignableFrom(eventType)) { if (declaredEventType.isAssignableFrom(eventType)) {
return true; return true;
} }
Class<?> eventClass = eventType.getRawClass(); if (PayloadApplicationEvent.class.isAssignableFrom(eventType.toClass())) {
if (eventClass != null && PayloadApplicationEvent.class.isAssignableFrom(eventClass)) {
ResolvableType payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric(); ResolvableType payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric();
if (declaredEventType.isAssignableFrom(payloadType)) { if (declaredEventType.isAssignableFrom(payloadType)) {
return true; 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) { if (this.method.getParameterCount() == 0) {
return new Object[0]; return new Object[0];
} }
Class<?> eventClass = declaredEventType.getRawClass(); if (!ApplicationEvent.class.isAssignableFrom(declaredEventType.toClass()) &&
if ((eventClass == null || !ApplicationEvent.class.isAssignableFrom(eventClass)) &&
event instanceof PayloadApplicationEvent) { event instanceof PayloadApplicationEvent) {
return new Object[] {((PayloadApplicationEvent) event).getPayload()}; 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) { for (ResolvableType declaredEventType : this.declaredEventTypes) {
Class<?> eventClass = declaredEventType.getRawClass(); Class<?> eventClass = declaredEventType.toClass();
if ((eventClass == null || !ApplicationEvent.class.isAssignableFrom(eventClass)) && if (!ApplicationEvent.class.isAssignableFrom(eventClass) &&
payloadType != null && declaredEventType.isAssignableFrom(payloadType)) { payloadType != null && declaredEventType.isAssignableFrom(payloadType)) {
return declaredEventType; return declaredEventType;
} }
if (eventClass != null && eventClass.isInstance(event)) { if (eventClass.isInstance(event)) {
return declaredEventType; return declaredEventType;
} }
} }
......
...@@ -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 class ByteArrayDecoder extends AbstractDataBufferDecoder<byte[]> {
public ByteArrayDecoder() { public ByteArrayDecoder() {
super(MimeTypeUtils.ALL); super(MimeTypeUtils.ALL);
} }
...@@ -42,8 +41,7 @@ public class ByteArrayDecoder extends AbstractDataBufferDecoder<byte[]> { ...@@ -42,8 +41,7 @@ public class ByteArrayDecoder extends AbstractDataBufferDecoder<byte[]> {
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
Class<?> clazz = elementType.getRawClass(); return (elementType.resolve() == byte[].class && super.canDecode(elementType, mimeType));
return (super.canDecode(elementType, mimeType) && byte[].class == clazz);
} }
@Override @Override
......
...@@ -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 class ByteBufferDecoder extends AbstractDataBufferDecoder<ByteBuffer> {
public ByteBufferDecoder() { public ByteBufferDecoder() {
super(MimeTypeUtils.ALL); super(MimeTypeUtils.ALL);
} }
...@@ -44,8 +43,8 @@ public class ByteBufferDecoder extends AbstractDataBufferDecoder<ByteBuffer> { ...@@ -44,8 +43,8 @@ public class ByteBufferDecoder extends AbstractDataBufferDecoder<ByteBuffer> {
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
Class<?> clazz = elementType.getRawClass(); return (ByteBuffer.class.isAssignableFrom(elementType.toClass()) &&
return (super.canDecode(elementType, mimeType) && clazz != null && ByteBuffer.class.isAssignableFrom(clazz)); super.canDecode(elementType, mimeType));
} }
@Override @Override
......
...@@ -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 class DataBufferDecoder extends AbstractDataBufferDecoder<DataBuffer> {
public DataBufferDecoder() { public DataBufferDecoder() {
super(MimeTypeUtils.ALL); super(MimeTypeUtils.ALL);
} }
...@@ -53,9 +52,8 @@ public class DataBufferDecoder extends AbstractDataBufferDecoder<DataBuffer> { ...@@ -53,9 +52,8 @@ public class DataBufferDecoder extends AbstractDataBufferDecoder<DataBuffer> {
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
Class<?> clazz = elementType.getRawClass(); return (DataBuffer.class.isAssignableFrom(elementType.toClass()) &&
return (super.canDecode(elementType, mimeType) && super.canDecode(elementType, mimeType));
clazz != null && DataBuffer.class.isAssignableFrom(clazz));
} }
@Override @Override
......
...@@ -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.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MimeType; import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils; 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 class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
public ResourceDecoder() { public ResourceDecoder() {
super(MimeTypeUtils.ALL); super(MimeTypeUtils.ALL);
} }
...@@ -50,8 +48,8 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> { ...@@ -50,8 +48,8 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
Class<?> clazz = elementType.getRawClass(); return (Resource.class.isAssignableFrom(elementType.toClass()) &&
return clazz != null && Resource.class.isAssignableFrom(clazz) && super.canDecode(elementType, mimeType); super.canDecode(elementType, mimeType));
} }
@Override @Override
...@@ -69,14 +67,12 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> { ...@@ -69,14 +67,12 @@ public class ResourceDecoder extends AbstractDataBufferDecoder<Resource> {
dataBuffer.read(bytes); dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer); DataBufferUtils.release(dataBuffer);
Class<?> clazz = elementType.getRawClass();
Assert.state(clazz != null, "No resource class");
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(Hints.getLogPrefix(hints) + "Read " + bytes.length + " bytes"); 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)); return new InputStreamResource(new ByteArrayInputStream(bytes));
} }
else if (Resource.class.isAssignableFrom(clazz)) { else if (Resource.class.isAssignableFrom(clazz)) {
......
...@@ -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"); public static final List<String> DEFAULT_DELIMITERS = Arrays.asList("\r\n", "\n");
private static final List<byte[]> DEFAULT_DELIMITER_BYTES = DEFAULT_DELIMITERS.stream() 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()); .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 @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
return (super.canDecode(elementType, mimeType) && return (elementType.resolve() == String.class && super.canDecode(elementType, mimeType));
String.class.equals(elementType.getRawClass()));
} }
@Override @Override
......
...@@ -105,8 +105,7 @@ public class FormHttpMessageWriter extends LoggingCodecSupport ...@@ -105,8 +105,7 @@ public class FormHttpMessageWriter extends LoggingCodecSupport
@Override @Override
public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) {
Class<?> rawClass = elementType.getRawClass(); if (!MultiValueMap.class.isAssignableFrom(elementType.toClass())) {
if (rawClass == null || !MultiValueMap.class.isAssignableFrom(rawClass)) {
return false; return false;
} }
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) { if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) {
......
...@@ -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) { private boolean isServerSentEvent(ResolvableType elementType) {
Class<?> rawClass = elementType.getRawClass(); return ServerSentEvent.class.isAssignableFrom(elementType.toClass());
return (rawClass != null && ServerSentEvent.class.isAssignableFrom(rawClass));
} }
@Override @Override
public Flux<Object> read(ResolvableType elementType, ReactiveHttpInputMessage message, public Flux<Object> read(
Map<String, Object> hints) { ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) {
boolean shouldWrap = isServerSentEvent(elementType); boolean shouldWrap = isServerSentEvent(elementType);
ResolvableType valueType = (shouldWrap ? elementType.getGeneric() : 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 @Override
public Mono<Object> readMono(ResolvableType elementType, ReactiveHttpInputMessage message, public Mono<Object> readMono(
Map<String, Object> hints) { ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) {
// We're ahead of String + "*/*" // We're ahead of String + "*/*"
// Let's see if we can aggregate the output (lest we time out)... // 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(); Flux<DataBuffer> body = message.getBody();
return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class); return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class);
} }
......
...@@ -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, private Flux<Publisher<DataBuffer>> encode(Publisher<?> input, ResolvableType elementType,
MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) { MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) {
Class<?> elementClass = elementType.getRawClass(); ResolvableType valueType = (ServerSentEvent.class.isAssignableFrom(elementType.toClass()) ?
ResolvableType valueType = (elementClass != null && ServerSentEvent.class.isAssignableFrom(elementClass) ?
elementType.getGeneric() : elementType); elementType.getGeneric() : elementType);
return Flux.from(input).map(element -> { return Flux.from(input).map(element -> {
......
...@@ -177,10 +177,9 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport ...@@ -177,10 +177,9 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
@Override @Override
public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) {
Class<?> rawClass = elementType.getRawClass(); return (MultiValueMap.class.isAssignableFrom(elementType.toClass()) &&
return rawClass != null && MultiValueMap.class.isAssignableFrom(rawClass) &&
(mediaType == null || (mediaType == null ||
this.supportedMediaTypes.stream().anyMatch(m -> m.isCompatibleWith(mediaType))); this.supportedMediaTypes.stream().anyMatch(element -> element.isCompatibleWith(mediaType))));
} }
@Override @Override
...@@ -281,7 +280,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport ...@@ -281,7 +280,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
if (body instanceof Resource) { if (body instanceof Resource) {
outputHeaders.setContentDispositionFormData(name, ((Resource) body).getFilename()); 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 body = (T) Mono.from((Publisher<?>) body).doOnNext(o -> outputHeaders
.setContentDispositionFormData(name, ((Resource) o).getFilename())); .setContentDispositionFormData(name, ((Resource) o).getFilename()));
} }
......
...@@ -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; private int messageBytesToRead;
public MessageDecoderFunction(ResolvableType elementType, int maxMessageSize) { public MessageDecoderFunction(ResolvableType elementType, int maxMessageSize) {
this.elementType = elementType; this.elementType = elementType;
this.maxMessageSize = maxMessageSize; this.maxMessageSize = maxMessageSize;
} }
@Override @Override
public Iterable<? extends Message> apply(DataBuffer input) { public Iterable<? extends Message> apply(DataBuffer input) {
try { 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) { if (this.output == null) {
int firstByte = input.read(); int firstByte = input.read();
if (firstByte == -1) { 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()); this.messageBytesToRead = CodedInputStream.readRawVarint32(firstByte, input.asInputStream());
if (this.messageBytesToRead > this.maxMessageSize) { if (this.messageBytesToRead > this.maxMessageSize) {
throw new DecodingException( throw new DecodingException(
"The number of bytes to read parsed in the incoming stream (" + "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); this.output = input.factory().allocateBuffer(this.messageBytesToRead);
} }
......
...@@ -84,9 +84,9 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> { ...@@ -84,9 +84,9 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
if (super.canDecode(elementType, mimeType)) { if (super.canDecode(elementType, mimeType)) {
Class<?> outputClass = elementType.getRawClass(); Class<?> outputClass = elementType.toClass();
return (outputClass != null && (outputClass.isAnnotationPresent(XmlRootElement.class) || return (outputClass.isAnnotationPresent(XmlRootElement.class) ||
outputClass.isAnnotationPresent(XmlType.class))); outputClass.isAnnotationPresent(XmlType.class));
} }
else { else {
return false; 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, public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { @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( Flux<XMLEvent> xmlEventFlux = this.xmlEventDecoder.decode(
inputStream, ResolvableType.forClass(XMLEvent.class), mimeType, hints); inputStream, ResolvableType.forClass(XMLEvent.class), mimeType, hints);
Class<?> outputClass = elementType.toClass();
QName typeName = toQName(outputClass); QName typeName = toQName(outputClass);
Flux<List<XMLEvent>> splitEvents = split(xmlEventFlux, typeName); 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 @Override
public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType, public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
return decode(inputStream, elementType, mimeType, hints).singleOrEmpty(); return decode(inputStream, elementType, mimeType, hints).singleOrEmpty();
} }
......
...@@ -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. * Encode from single value to a byte stream containing XML elements.
* *
* <p>{@link javax.xml.bind.annotation.XmlElements @XmlElements} and * <p>{@link javax.xml.bind.annotation.XmlElements @XmlElements} and
* {@link javax.xml.bind.annotation.XmlElement @XmlElement} can be used to specify how * {@link javax.xml.bind.annotation.XmlElement @XmlElement} can be used
* collections should be marshalled. * to specify how collections should be marshalled.
* *
* @author Sebastien Deleuze * @author Sebastien Deleuze
* @author Arjen Poutsma * @author Arjen Poutsma
...@@ -73,7 +73,6 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> { ...@@ -73,7 +73,6 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
else { else {
return false; return false;
} }
} }
@Override @Override
......
...@@ -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. * 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 @Nullable
protected ReactiveAdapter getAdapter(HandlerResult result) { protected ReactiveAdapter getAdapter(HandlerResult result) {
Class<?> returnType = result.getReturnType().getRawClass(); return getAdapterRegistry().getAdapter(result.getReturnType().resolve(), result.getReturnValue());
return getAdapterRegistry().getAdapter(returnType, result.getReturnValue());
} }
/** /**
* Select the best media type for the current request through a content * Select the best media type for the current request through a content negotiation algorithm.
* negotiation algorithm.
* @param exchange the current request * @param exchange the current request
* @param producibleTypesSupplier the media types that can be produced for 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 @Nullable
protected MediaType selectMediaType(ServerWebExchange exchange, protected MediaType selectMediaType(ServerWebExchange exchange,
......
...@@ -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 * @return indicates completion or error
* @since 5.0.2 * @since 5.0.2
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
protected Mono<Void> writeBody(@Nullable Object body, MethodParameter bodyParameter, protected Mono<Void> writeBody(@Nullable Object body, MethodParameter bodyParameter,
@Nullable MethodParameter actualParam, ServerWebExchange exchange) { @Nullable MethodParameter actualParam, ServerWebExchange exchange) {
ResolvableType bodyType = ResolvableType.forMethodParameter(bodyParameter); ResolvableType bodyType = ResolvableType.forMethodParameter(bodyParameter);
ResolvableType actualType = (actualParam != null ? ResolvableType.forMethodParameter(actualParam) : bodyType); ResolvableType actualType = (actualParam != null ? ResolvableType.forMethodParameter(actualParam) : bodyType);
Class<?> bodyClass = bodyType.resolve(); ReactiveAdapter adapter = getAdapterRegistry().getAdapter(bodyType.resolve(), body);
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(bodyClass, body);
Publisher<?> publisher; Publisher<?> publisher;
ResolvableType elementType; ResolvableType elementType;
...@@ -128,11 +127,11 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa ...@@ -128,11 +127,11 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
} }
else { else {
publisher = Mono.justOrEmpty(body); publisher = Mono.justOrEmpty(body);
elementType = ((bodyClass == null || bodyClass.equals(Object.class)) && body != null ? elementType = (bodyType.toClass() == Object.class && body != null ?
ResolvableType.forInstance(body) : bodyType); 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); return Mono.from((Publisher<Void>) publisher);
} }
......
...@@ -105,8 +105,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume ...@@ -105,8 +105,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume
if (!MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) { if (!MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) {
ResolvableType[] genericTypes = ResolvableType.forMethodParameter(parameter).getGenerics(); ResolvableType[] genericTypes = ResolvableType.forMethodParameter(parameter).getGenerics();
if (genericTypes.length == 2) { if (genericTypes.length == 2) {
Class<?> declaredClass = genericTypes[1].getRawClass(); return !List.class.isAssignableFrom(genericTypes[1].toClass());
return (declaredClass == null || !List.class.isAssignableFrom(declaredClass));
} }
} }
return false; return false;
......
...@@ -158,9 +158,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR ...@@ -158,9 +158,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
} }
if (attribute == null) { if (attribute == null) {
Class<?> attributeClass = attributeType.getRawClass(); return createAttribute(attributeName, attributeType.toClass(), context, exchange);
Assert.state(attributeClass != null, "No attribute class");
return createAttribute(attributeName, attributeClass, context, exchange);
} }
ReactiveAdapter adapterFrom = getAdapterRegistry().getAdapter(null, attribute); ReactiveAdapter adapterFrom = getAdapterRegistry().getAdapter(null, attribute);
......
...@@ -120,7 +120,7 @@ class ModelInitializer { ...@@ -120,7 +120,7 @@ class ModelInitializer {
Object value = handlerResult.getReturnValue(); Object value = handlerResult.getReturnValue();
if (value != null) { if (value != null) {
ResolvableType type = handlerResult.getReturnType(); ResolvableType type = handlerResult.getReturnType();
ReactiveAdapter adapter = this.adapterRegistry.getAdapter(type.getRawClass(), value); ReactiveAdapter adapter = this.adapterRegistry.getAdapter(type.resolve(), value);
if (isAsyncVoidType(type, adapter)) { if (isAsyncVoidType(type, adapter)) {
return Mono.from(adapter.toPublisher(value)); 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) { 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) { private String getAttributeName(MethodParameter param) {
......
...@@ -94,9 +94,9 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand ...@@ -94,9 +94,9 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand
@Nullable @Nullable
private static Class<?> resolveReturnValueType(HandlerResult result) { private static Class<?> resolveReturnValueType(HandlerResult result) {
Class<?> valueType = result.getReturnType().getRawClass(); Class<?> valueType = result.getReturnType().toClass();
Object value = result.getReturnValue(); Object value = result.getReturnValue();
if ((valueType == null || valueType.equals(Object.class)) && value != null) { if (valueType == Object.class && value != null) {
valueType = value.getClass(); valueType = value.getClass();
} }
return valueType; return valueType;
......
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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; return true;
} }
Class<?> type = result.getReturnType().getRawClass(); Class<?> type = result.getReturnType().toClass();
ReactiveAdapter adapter = getAdapter(result); ReactiveAdapter adapter = getAdapter(result);
if (adapter != null) { if (adapter != null) {
if (adapter.isNoValue()) { 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(); type = result.getReturnType().getGeneric().toClass();
} }
return (type != null && return (CharSequence.class.isAssignableFrom(type) || Rendering.class.isAssignableFrom(type) ||
(CharSequence.class.isAssignableFrom(type) || Rendering.class.isAssignableFrom(type) || Model.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) ||
Model.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) || void.class.equals(type) || View.class.isAssignableFrom(type) ||
void.class.equals(type) || View.class.isAssignableFrom(type) || !BeanUtils.isSimpleProperty(type));
!BeanUtils.isSimpleProperty(type)));
} }
private boolean hasModelAnnotation(MethodParameter parameter) { 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(); MethodParameter parameter = result.getReturnTypeSource();
Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext()); Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext());
Class<?> clazz = valueType.getRawClass(); Class<?> clazz = valueType.toClass();
if (clazz == null) { if (clazz == Object.class) {
clazz = returnValue.getClass(); 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); viewsMono = resolveViews(getDefaultViewName(exchange), locale);
} }
else if (CharSequence.class.isAssignableFrom(clazz) && !hasModelAnnotation(parameter)) { else if (CharSequence.class.isAssignableFrom(clazz) && !hasModelAnnotation(parameter)) {
......
...@@ -101,8 +101,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg ...@@ -101,8 +101,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg
if (!MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) { if (!MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) {
ResolvableType[] genericTypes = ResolvableType.forMethodParameter(parameter).getGenerics(); ResolvableType[] genericTypes = ResolvableType.forMethodParameter(parameter).getGenerics();
if (genericTypes.length == 2) { if (genericTypes.length == 2) {
Class<?> declaredClass = genericTypes[1].getRawClass(); return !List.class.isAssignableFrom(genericTypes[1].toClass());
return (declaredClass == null || !List.class.isAssignableFrom(declaredClass));
} }
} }
return false; return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册