专栏首页用户7614879的专栏Java Spring 使用AOP代理方法 类型转换异常java.lang.ClassCastException 原因及解决办法

Java Spring 使用AOP代理方法 类型转换异常java.lang.ClassCastException 原因及解决办法

有一段代码 有时会出现类型转换异常 很诡异 排查原因发现是spring aop造成的。

项目中我使用了aop进行自定义权限,若权限不通过 返回固定的ResponseVo 对应字段为:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseVo<T> {

    @JsonProperty("response_code")
    private Integer responseCode;
    @JsonProperty("verbose_msg")
    private String verboseMsg;

    private T data;
}

为了开发方便 不需要每个controller都写一个ResponseVo的构建 使用了ResponseBodyAdvice来帮助构建,之前的文章里写过

说白了就说Controller方法只需要返回一个任意对象 由spring将其封装到ResponseVo的data字段中。

下面的是使用ResponseBodyAdvice的效果 上面是正常写法

这个接口比较简单可能没太大对比度

但是在鉴权的aop中 若权限通过则调用方法 返回方法结果

若不通过 则返回内容为:

是一个ResponseVo

报错内容为 不能把ResponseVo转为BaseInfoVo,且堆栈中看不出任何自己写的代码引用。

测试时发现 有权限时 这个接口不报错,没有权限时就会报类型转换异常。找到这个规律 就很容易知道问题出在哪了。

原因是: spring在代理这个方法时 知道这个方法声明的返回值为BaseInfoVo,但当权限不通过时 我通过切面将其返回值改为了ResponseVo,但R不能转为B 就会报类型转换异常。

解决办法有2种:

1 Controller的返回类型统一为ResponseVo,这样就没办法使用ResponseBodyAdvice了。

2 将方法的返回值声明为所有可能被返回类型的共同接口:1 Object 因为Object是所有类的父类 2或声明一个接口由R和Q分别实现 但这样做意义不大。 缺点是返回值都为Object的话 语义不明确

最终选用了方法1

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • web框架:Spring

    目前在企业开发中只使用Spring开发的已经寥寥无几,但是现在流行的组合框架中却不可缺乏Spring的身影。Spring对于代码的解耦,优化层次,编程思想方面有...

    黑白格
  • spring框架复习大纲【面试+提高】

    spring框架复习大纲【面试+提高】 简介 创立于 2003年 , 是为了解决企业级开发的复杂性的! 是一个分层的se/ee(javase和java ee...

    Java帮帮
  • Spring常见问题总结(补充版)

    这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码!这篇文章整理了挺长时间,下面的很多问题我自己在使用 Spring 的过...

    乔戈里
  • Java面试题汇总---基础版(附答案)

    基于我个人对面试的认知和招聘经验,在此我总结一下Java开发者的基础知识掌握要求,及应聘者面试的需要准备的内容。

    攻城狮的那点事
  • Java面试高频知识点总结 Spring

    我们一般说的Spring框架指的都是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访...

    Steve Wang
  • 【续】java面试Spring必备知识点,怼死面试官,从我做起

    小海有话说 这篇文章是是上一篇文章Spring必备知识点的续文,还是那句话,如果感觉有用就收藏,我没有办法满足所有人的要求,我只能尽量满足大部分...

    用户1257393
  • Spring AOP环绕异常影响的报错

    网上去stackoverflow搜,也是搜到这个问题:https://stackoverflow.com/search?q=java.lang.ClassCas...

    SmileNicky
  • Java常见异常类型及原因分析

    顾名思义,NullPointerException 是空指针异常。但是在 Java 中没有指针,怎么会有 空指针异常呢?

    慕白
  • 面对缓存,出现这些问题你要如何思考!

    缓存可以说是无处不在,比如 PC 电脑中的内存、CPU 中的二级缓存、HTTP 协议中的缓存控制、CDN 加速技术都是使用了缓存的思想来解决性能问题。 Java...

    Java架构

扫码关注云+社区

领取腾讯云代金券