解决java.lang.ClassCastException

目录

问题

原因

解决方案


问题

前后端分离开发中,往往需要统一封装返回数据用到一个Result类包装多个接口:

解决java.lang.ClassCastException_第1张图片

重复劳动并不优雅,于是想用@RestControllerAdvice做控制器拦截增强,进行封装。

代码如下:

@RestControllerAdvice(basePackages = "com.mijiu.controller")
@NonNullApi
public class ResultAdvice implements ResponseBodyAdvice {
  
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(@Nullable Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return Result.success(body);
    }
}

supports直接返回true代表全部拦截进行封装。

于是开始测试这个返回String类型的接口

解决java.lang.ClassCastException_第2张图片

结果:

解决java.lang.ClassCastException_第3张图片

抛出了这个类强制转换异常:

java.lang.ClassCastException

研究了一下得出了原因

原因

封装的统一响应AOP对返回的数据进行了封装,而Controller层返回的数据类型定义为String类型。导致响应解析器转换报错。目前发现仅仅对String类型抛出该异常。

解决方案

判断body类型是String则进行手动转换

解决java.lang.ClassCastException_第4张图片

@Override
    public Object beforeBodyWrite(@Nullable Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if(body instanceof String){
            return JSONUtil.toJsonStr(Result.success(body));
        }

        return Result.success(body);
    }

重启项目再次调试。

解决java.lang.ClassCastException_第5张图片

成功,问题解决!

你可能感兴趣的:(踩坑合集,java,spring,boot,spring,后端)