首页
学习
活动
专区
圈层
工具
发布

API接口统一格式返回(二) 之 解决遗留返回String问题

老顾导读

1、前言

2、分析原因

3、解决方案一

4、解决方案二

5、解决方案三

6、总结

一、前言

之前文章中介绍了《如何设计API接口,实现统一格式返回?》,最后章节中谈到优雅方案,利用ResponseBodyAdive方案,进行返回体包装;但在使用过程中发现如果方法返回String类型时,就会报错

我们来看一下怎么解决?

二、分析原因

我们通过封装后返回的就是转换json格式的数据,为何报了类型转换异常?为什么这个对象要转换成String呢?然后报了cannot be cast to java.lang.String错误

我们debug一下:

那么问题是找到了,返回字符串的时候采用的是特殊的StringHttpMessageConverter转换器,而其他格式则是采用MappingJackson2HttpMessageConverter转换器来解析的。

StringHttpMessageConverter转换器将内容转为String字符串,而当前我们返回的则是一个具体的对象,这就导致了报错的根本原因也就是类型转换异常

问题的根因找到了,那我们怎么去解决?

三、解决方案一

我们知道了String类型会用StringHttpMessageConverter进行处理,其他的类型用MappingJackson2HttpMessageConverter处理,那我们是不是也可以把String类型也用MappingJackson2HttpMessageConverter处理呢。

那我们可以提升优先级

@Configurationpublic class WebConfiguration implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(0, new MappingJackson2HttpMessageConverter()); }}

四、解决方案二

我们也可以去除StringHttpMessageConverter

@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // add方法可以指定顺序,有多个自定义的WebMvcConfigurerAdapter时,可以改变相互之间的顺序 // 但是都在springmvc内置的converter前面 ArrayList<HttpMessageConverter<?>> objects = new ArrayList<>(); for (HttpMessageConverter<?> converter : converters) { if (converter.getClass().isAssignableFrom(StringHttpMessageConverter.class)) { objects.add(converter); } } converters.removeAll(objects);}

五、解决方案三

我们可以在转换的时候,判断一下String类型

@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { //当返回类型是String时,用的是StringHttpMessageConverter转换器,无法转换为Json格式 //必须在方法体上标注RequestMapping(produces = "application/json; charset=UTF-8") if(body instanceof String){ String str = JSON.toJSONString(Result.success(body)); return str; } return Result.success(body);}

六、总结

之前留的坑,到现在才来总结,小伙伴们之前有没有碰到过,有没有尝试去解决呢?如果自己已经解决了,说明你自身的要求比较高哦。谢谢!!!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OA9PEkB_UEbHsJStdfG_bmKQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券