文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot统一返回处理出现cannot be cast to java.lang.String异常

2023-10-05 19:57

关注

SpringBoot统一返回处理出现cannot be cast to java.lang.String异常

一 问题出现背景:

在使用@RestControllerAdvice和实现ResponseBodyAdvicecontroller层统一返回封装时。当返回字符串时会报 “cannot be cast to java.lang.String” 异常,返回其他类型就无任何问题。
在这里插入图片描述

二 解决方案

如果返回的是字符串直接手动封装返回对象转成json字符串返回即可。
在这里插入图片描述
完整代码

@RestControllerAdvicepublic class ResponseResult implements ResponseBodyAdvice<Object> {        @Override    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {        if (returnType.getDeclaringClass().isAnnotationPresent(ResponseNotIntercept.class)) {            //若在类中加了@ResponseNotIntercept 则该类中的方法不用做统一的拦截            return false;        }        if (returnType.getMethod().isAnnotationPresent(ResponseNotIntercept.class)) {            //若方法上加了@ResponseNotIntercept 则该方法不用做统一的拦截            return false;        }        return true;    }    @Override    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,      Class<? extends HttpMessageConverter<?>> selectedConverterType,      ServerHttpRequest request, ServerHttpResponse response) {        if (body instanceof Result) {            // 提供一定的灵活度,如果body已经被包装了,就不进行包装            return body;        }        if (body instanceof String) {            //解决返回值为字符串时,不能正常包装            return JSON.toJSONString(Result.success(body));        }        return Result.success(body);    }}

三 异常原因分析

原因:

SpringMVC 默认会注册一些自带的HttpMessageConvertor (从先后顺序排列分别为ByteArrayHttpMessageConverter、StringHttpMessageConverter、ResourceHttpMessageConverter,SourceHttpMessageConverter、AllEncompassingFormHttpMessageConverter) ,后端服务使用Restful API的形式,前后端得规范一般是json格式,SpringMVC 自带MappingJackson2HttpMessageConverter,在依赖中引入 jackson 包后,容器会把MappingJackson2HttpMessageConverter自动注册到 messageConverters链的末尾

当返回的数据是非字符串时使用的 MappingJackson2HttpMessageConverter 写入返回对象。
当返回的数据是字符串时,此处得方法是要去循环遍历HttpMessageConverter集,因为StringHttpMessageConverter会先被遍历到,这时会认为StringHttpMessageConverter可以使用,在返回Result是使用((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);此方法是父类方法body参数类型为Object,实际调用的为StringHttpMessageConverter中的addDefaultHeaders(HttpHeaders headers, String s, @Nullable MediaType type)方法,使用String类型的s来接收Result类型的body,类型不匹配则出现Result cannot be cast to java.lang.String异常。

源码详细分析:

正常返回:

返回为字符串异常

在这里插入图片描述

来源地址:https://blog.csdn.net/weixin_43811057/article/details/127655041

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯