Add DispatcherHandlerErrorTests

The tests demonstrate failures at various phases of request processing
and the resulting error signals.
This commit is contained in:
Rossen Stoyanchev
2015-12-10 16:15:11 -05:00
parent 4ba3d0736f
commit a0018d13e1
10 changed files with 359 additions and 25 deletions
@@ -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;
@@ -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;
@@ -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());
}
@@ -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));
}
@@ -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);