本文介绍: java.lang.ClassCastException: class com.mijiu.commom.result.Result cannot be cast to class java.lang.String (com.mijiu.commom.result.Result is in unnamed module of loader app ; java.lang.String is in

目录

问题

原因

解决方案


问题

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

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

代码如下:

@RestControllerAdvice(basePackages = "com.mijiu.controller")
@NonNullApi
public class ResultAdvice implements ResponseBodyAdvice<Object> {
  
    @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

研究了一下得出了原因

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

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

@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);
    }

重启项目再次调试。

成功,问题解决!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注