关于HttpMediaTypeNotAcceptableException异常

spring


发表于 2016-09-29 23:43


今天查看日志记录的时候,发现了一个很奇怪的异常:HttpMediaTypeNotAcceptableException。
之前从来没有遇到过这个异常,搜了下这个异常可能产生的原因,发现绝大部分解释是:缺少依赖的jar包导致的。。。。这个也太低级了,之前也从没碰到过,所以可以肯定不是这样原因造成的。
看了下access log文件,发现是/data/system/kaixin001.gif 这个url导致的这个异常,这个url是新增的,用来向客户端返回data的json格式的数据,
@RequestMapping(value = "data/**")
    @ResponseBody
    public JsonResult queryData(HttpServletRequest request) throws LogicException {

看了下异常栈,发现正是ResponseBody这个annotation导致的异常:

protected <T> void writeWithMessageConverters(T returnValue, MethodParameter returnType,
            ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)
            throws IOException, HttpMediaTypeNotAcceptableException {

        Class<?> returnValueClass = returnValue.getClass();
        HttpServletRequest servletRequest = inputMessage.getServletRequest();
        List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest);
        List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass);

        Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>();
        for (MediaType requestedType : requestedMediaTypes) {
            for (MediaType producibleType : producibleMediaTypes) {
                if (requestedType.isCompatibleWith(producibleType)) {
                    compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType));
                }
            }
        }
        if (compatibleMediaTypes.isEmpty()) {
            throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);
        }

debug之后可以发现,请求的媒体类型为image/gif,这个媒体类型不被可接受,所以直接抛出了HttpMediaTypeNotAcceptableException这个异常。

解决办法也简单,粗暴点的:

<bean  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes">
       <list>
         <value>*/*</value>
       </list>
    </property>
</bean>               
由于这个异常对我没有什么影响,所以这里直接@ExceptionHandler处理之后返回400状态码处理

搜索