解决Api统一格式返回,遗留地返回String一个问题

目录

  1. 前言
  2. 分析原因
  3. 解决方案一
  4. 解决方案二
  5. 解决方案三
  6. 总结

前言

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

java.lang.ClassCastException: com.xxxx.dto.common.ResponseResult cannot be cast to java.lang.String

我们来看一下怎么解决?

分析原因

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

我们debug一下:

我们看到,这里所选的类型转换器是'
org.springframework.http.converter.StringHttpMessageConverter'
,至此我们再看如果返回其他类型看看这里选择的是何种转换器呢?

返回值类型改为int后,可以发现mvc框架选中的转换器是
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

那么问题是找到了,返回字符串的时候采用的是特殊的
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);}

总结

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


(0)

相关推荐