解决:No converter for [xxxx] with preset Content-Type ‘text/plain;version=0.0.4;charset=utf-8‘

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路解决:No converter for [xxxx] with preset Content-Type ‘text/plain;version=0.0.4;charset=utf-8‘,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

项目背景

Spring Boot 2.X

问题描述

错误信息如下:

org.springframework.http.converter.HttpMessageNotWritableException: No converter for [xxxx] with preset Content-Type 'text/plain;version=0.0.4;charset=utf-8'
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:312)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181)
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:428)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:75)
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1323)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1134)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)

问题分析

例如上述错误信息,项目出现了某种异常,并且响应对象设置了响应头,如: Content-Type ‘text/plain;version=0.0.4;charset=utf-8’。
当内部抛出了异常后,项目中的全局异常处理返回了一个通用的实体对象,是JSON格式,和响应头的Content-Type不一致,导致SpringMVC在转换的时候报此类错误。

问题出现场景:

一般出现在,文件下载接口的实现上;
或者,程序内部抛出:ClientAbortException: java.io.IOException: 断开的管道

解决方案

方案一:修改Controller定义

适合场景:返回格式只需兼容的情况

手动指定响应头,设置兼容其它格式,例如:

@PostMapping(value = "xxxx",
  produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE})

方案二:修改Controller返回值

适合场景:文件下载接口等

解决:原来有返回值的话,修改为返回void。因为文件下载接口,一般是借助HttpServletResponse对象来直接返回的。

方案三:全局处理

解决:在全局异常的处理中,加上下面的逻辑:

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    public static final String CLIENT_ABORT_EXCEPTION_CLASS = "org.apache.catalina.connector.ClientAbortException";

    @ExceptionHandler(Exception.class)
    public void handleException(Exception e, HttpServletResponse response) {
        if (CLIENT_ABORT_EXCEPTION_CLASS.equals(e.getClass().getName())) {
            log.warn("出现ClientAbortException");
            return;
        };
        log.error("全局异常信息:{}", e.getMessage(), e);
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155593.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!