From d7d1ae89f366475e28589bfe8a39f840a1175773 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 22 May 2009 10:45:52 +0000 Subject: [PATCH] SPR-5767 - Misleading error message in HandlerMethodInvoker.resolveRequestBody() --- .../support/HandlerMethodInvoker.java | 3 +- .../DefaultHandlerExceptionResolver.java | 3 +- .../HttpMediaTypeNotSupportedException.java | 34 ++++++++++++++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java index c403f6bd4d..106d9ad712 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java @@ -437,7 +437,6 @@ public class HandlerMethodInvoker { /** * Resolves the given {@link RequestBody @RequestBody} annotation. - * Throws an UnsupportedOperationException by default. */ @SuppressWarnings("unchecked") protected Object resolveRequestBody(MethodParameter methodParam, NativeWebRequest webRequest, Object handler) @@ -447,7 +446,7 @@ public class HandlerMethodInvoker { Class paramType = methodParam.getParameterType(); MediaType contentType = inputMessage.getHeaders().getContentType(); if (contentType == null) { - throw new IllegalStateException("Cannot extract response: no Content-Type found"); + throw new HttpMediaTypeNotSupportedException("Cannot extract @RequestBody: no Content-Type found"); } List allSupportedMediaTypes = new ArrayList(); for (HttpMessageConverter messageConverter : messageConverters) { diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java index b54c40786b..de0a56a50c 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java @@ -29,6 +29,7 @@ import org.springframework.core.Ordered; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; @@ -187,7 +188,7 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE); List mediaTypes = ex.getSupportedMediaTypes(); - if (mediaTypes != null) { + if (!CollectionUtils.isEmpty(mediaTypes)) { response.setHeader("Accept", MediaType.toString(mediaTypes)); } return new ModelAndView(); diff --git a/org.springframework.web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java b/org.springframework.web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java index ae9d9fd2cf..163826ec67 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java +++ b/org.springframework.web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java @@ -1,5 +1,22 @@ +/* + * Copyright 2002-2009 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.web; +import java.util.Collections; import java.util.List; import javax.servlet.ServletException; @@ -7,17 +24,26 @@ import org.springframework.http.MediaType; /** * Exception thrown when a client POSTs or PUTs content - * not supported by request handler does not support a - * specific request method. + * not supported by request handler. * * @author Arjen Poutsma * @since 3.0 */ public class HttpMediaTypeNotSupportedException extends ServletException { - private MediaType contentType; + private final MediaType contentType; - private List supportedMediaTypes; + private final List supportedMediaTypes; + + /** + * Create a new HttpMediaTypeNotSupportedException. + * @param message the exception message + */ + public HttpMediaTypeNotSupportedException(String message) { + super(message); + this.contentType = null; + this.supportedMediaTypes = Collections.emptyList(); + } /** * Create a new HttpMediaTypeNotSupportedException.