mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
Add DispatcherHandlerErrorTests
The tests demonstrate failures at various phases of request processing and the resulting error signals.
This commit is contained in:
+3
@@ -44,6 +44,9 @@ public abstract class AbstractDecoder<T> implements Decoder<T> {
|
||||
|
||||
@Override
|
||||
public boolean canDecode(ResolvableType type, MimeType mimeType, Object... hints) {
|
||||
if (mimeType == null) {
|
||||
return true;
|
||||
}
|
||||
for (MimeType supportedMimeType : this.supportedMimeTypes) {
|
||||
if (supportedMimeType.isCompatibleWith(mimeType)) {
|
||||
return true;
|
||||
|
||||
+3
@@ -44,6 +44,9 @@ public abstract class AbstractEncoder<T> implements Encoder<T> {
|
||||
|
||||
@Override
|
||||
public boolean canEncode(ResolvableType type, MimeType mimeType, Object... hints) {
|
||||
if (mimeType == null) {
|
||||
return true;
|
||||
}
|
||||
for (MimeType supportedMimeType : this.supportedMimeTypes) {
|
||||
if (supportedMimeType.isCompatibleWith(mimeType)) {
|
||||
return true;
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ public class DispatcherHandler implements HttpHandler, ApplicationContextAware {
|
||||
return resultHandler;
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("No HandlerResultHandler: " + handlerResult.getValue());
|
||||
throw new IllegalStateException("No HandlerResultHandler for " + handlerResult.getValue());
|
||||
}
|
||||
|
||||
|
||||
|
||||
+5
-4
@@ -26,6 +26,7 @@ import reactor.Publishers;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.core.convert.support.DefaultConversionService;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.core.codec.support.ByteBufferDecoder;
|
||||
@@ -33,6 +34,7 @@ import org.springframework.core.codec.Decoder;
|
||||
import org.springframework.core.codec.support.JacksonJsonDecoder;
|
||||
import org.springframework.core.codec.support.JsonObjectDecoder;
|
||||
import org.springframework.core.codec.support.StringDecoder;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.reactive.HandlerAdapter;
|
||||
import org.springframework.web.reactive.HandlerResult;
|
||||
import org.springframework.web.reactive.method.HandlerMethodArgumentResolver;
|
||||
@@ -45,9 +47,9 @@ import org.springframework.web.method.HandlerMethod;
|
||||
*/
|
||||
public class RequestMappingHandlerAdapter implements HandlerAdapter, InitializingBean {
|
||||
|
||||
private List<HandlerMethodArgumentResolver> argumentResolvers;
|
||||
private final List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>();
|
||||
|
||||
private ConversionService conversionService;
|
||||
private ConversionService conversionService = new DefaultConversionService();
|
||||
|
||||
|
||||
public void setArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
|
||||
@@ -70,12 +72,11 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Initializin
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
if (this.argumentResolvers == null) {
|
||||
if (ObjectUtils.isEmpty(this.argumentResolvers)) {
|
||||
|
||||
List<Decoder<?>> decoders = Arrays.asList(new ByteBufferDecoder(),
|
||||
new StringDecoder(), new JacksonJsonDecoder(new JsonObjectDecoder()));
|
||||
|
||||
this.argumentResolvers = new ArrayList<>();
|
||||
this.argumentResolvers.add(new RequestParamArgumentResolver());
|
||||
this.argumentResolvers.add(new RequestBodyArgumentResolver(decoders, this.conversionService));
|
||||
}
|
||||
|
||||
+11
-11
@@ -135,10 +135,20 @@ public class ResponseBodyResultHandler implements HandlerResultHandler, Ordered
|
||||
return Publishers.empty();
|
||||
}
|
||||
|
||||
Publisher<?> publisher;
|
||||
ResolvableType elementType;
|
||||
ResolvableType returnType = result.getValueType();
|
||||
if (this.conversionService.canConvert(returnType.getRawClass(), Publisher.class)) {
|
||||
publisher = this.conversionService.convert(value, Publisher.class);
|
||||
elementType = returnType.getGeneric(0);
|
||||
}
|
||||
else {
|
||||
publisher = Publishers.just(value);
|
||||
elementType = returnType;
|
||||
}
|
||||
|
||||
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
|
||||
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(returnType);
|
||||
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(elementType);
|
||||
|
||||
if (producibleMediaTypes.isEmpty()) {
|
||||
producibleMediaTypes.add(MediaType.ALL);
|
||||
@@ -172,16 +182,6 @@ public class ResponseBodyResultHandler implements HandlerResultHandler, Ordered
|
||||
}
|
||||
|
||||
if (selectedMediaType != null) {
|
||||
Publisher<?> publisher;
|
||||
ResolvableType elementType;
|
||||
if (this.conversionService.canConvert(returnType.getRawClass(), Publisher.class)) {
|
||||
publisher = this.conversionService.convert(value, Publisher.class);
|
||||
elementType = returnType.getGeneric(0);
|
||||
}
|
||||
else {
|
||||
publisher = Publishers.just(value);
|
||||
elementType = returnType;
|
||||
}
|
||||
Encoder<?> encoder = resolveEncoder(elementType, selectedMediaType);
|
||||
if (encoder != null) {
|
||||
response.getHeaders().setContentType(selectedMediaType);
|
||||
|
||||
Reference in New Issue
Block a user