首页 > 编程语言 >Mybatis-plus 3.5.4 的AOP问题 java.lang.ClassCastException: class org.springframework.aop.framework.Jdk

Mybatis-plus 3.5.4 的AOP问题 java.lang.ClassCastException: class org.springframework.aop.framework.Jdk

时间:2024-10-16 09:12:19浏览次数:6  
标签:lang core Repository Mapper Spring 代理 AOP MyBatis class

报错,然后我把mapper上的@repository删掉就好了,为什么
ChatGPT 说:
ChatGPT
删除 @Repository 注解后问题解决,可能是与 Spring AOP 代理机制和 MyBatis Plus 结合时的一些细节有关。以下是原因分析:

  1. @Repository 和 Spring AOP 代理的影响
    @Repository 注解的主要作用是将类标记为持久层组件,并将其纳入 Spring 的组件扫描机制。标记为 @Repository 的类可能会被 Spring AOP 代理增强,特别是在涉及到事务管理(@Transactional)或其他 AOP 切面的场景中。

当 Spring AOP 使用 JDK 动态代理时,它要求代理的目标类必须实现接口。由于 MyBatis 的 Mapper 接口本身已经通过 MyBatis 实现了动态代理,如果再加上 Spring 的 JDK 动态代理,可能会导致代理链出错,最终抛出 ClassCastException,即尝试将 JdkDynamicAopProxy 转换为 MybatisMapperProxy 时失败。

为什么删除 @Repository 后解决问题?

删除 @Repository 后,Spring 不再将 Mapper 接口作为 AOP 代理对象,因此避免了代理链的冲突。Mapper 接口的动态代理将完全由 MyBatis 处理,而不会再通过 Spring AOP 进行代理,解决了 ClassCastException 的问题。
2. 代理机制冲突
在 Spring 中,通常有两种代理机制:

JDK 动态代理:要求目标类实现接口。
CGLIB 代理:通过继承目标类来创建代理,不需要目标类实现接口。
当同时使用 MyBatis 和 Spring 时,MyBatis 会通过自己的代理机制为 Mapper 接口创建代理对象,而 Spring 通过 @Repository 注解可能会试图再次为这个代理对象应用 JDK 动态代理。这种双重代理的行为有时会导致代理链中的类型转换错误。

  1. @Repository 注解的必要性
    在 MyBatis 中,Mapper 接口的实现是通过 MyBatis 框架自动生成代理的,通常不需要 @Repository 注解来让 Spring 管理这个 Mapper。@Mapper 或者通过 @MapperScan 配置已经足够让 Spring 管理和注入这些 Mapper。

  2. ServiceImpl 和 Mapper 代理的结合问题
    从错误日志来看,问题似乎出现在 MyBatis Plus 的 ServiceImpl 类与 Mapper 代理的结合过程中。删除 @Repository 后,Spring 不再对 Mapper 进行重复代理,ServiceImpl 类可以正常与 MyBatis 的 Mapper 代理对象配合使用。

解决方案总结:
删除 @Repository:对 MyBatis 的 Mapper 接口来说,@Repository 并不是必须的,通常使用 @Mapper 或者通过 @MapperScan 来扫描并注册 Mapper 即可。
避免代理冲突:Spring 和 MyBatis 的代理机制可能会发生冲突,尤其是在事务处理或者其他 AOP 场景中。删除 @Repository 可以避免 Spring AOP 的二次代理。
检查事务配置:如果在某些场景下仍需要 AOP 代理,确保 Spring 的事务管理配置正确,避免代理链冲突。
删除 @Repository 是一种常见的解决方案,尤其在 MyBatis 和 Spring 一起使用时,可以减少不必要的代理干扰。

标签:lang,core,Repository,Mapper,Spring,代理,AOP,MyBatis,class
From: https://www.cnblogs.com/psuitj/p/18398688

相关文章

  • 第九章习题3-编写一个函数print,打印一个学生的成绩数组,该数组有5个学生的数据记录,每个
     ......
  • Python入门-面相对象——class(类)、封装、继承、多态、类型注解
    面向对象面向对象就是设计一个类,基于类创建对象,并使用创建出来的类完成具体的工作面向对象的三大特性:封装、继承、多态面向对象基本概述:属性:名词,用来描述事物的外在特征的,例如:姓名,性别,年龄,身高,体重...行为:动词,表示事物能够做什么,例如:......
  • Contextualization Distillation from Large Language Model for Knowledge Graph Com
    文章目录题目摘要简介相关工作语境化提取实验结论限制附录题目用于知识图完成的大型语言模型的语境化提取论文地址:https://aclanthology.org/2024.findings-eacl.32/项目地址:https://github.com/davidli0406/contextulization-Distillation摘要    ......
  • Java的引擎效验报错-java.lang.VerifyError
    java包直接修改bytecode,经常会报错java.lang.VerifyError,包含非常多种的检查直接修改引擎dll文件去除效验jvm.dll-X64-V21.0.0.0.text:000000018084438F488D0DDA422100learcx,aVerifyingMetho;"Verifyingmethod%s".text:00000001......
  • C#关于EF Core 8.0 使用 Contians 遇到的坑
    最近接手一个项目二开,由于需要用到Sqlserver的JSON_Value功能,所以升级成EFCore8.0。但是使用FindAsIQueryable进行集合包含查找的时候报错了。查看EFview发现生成的Sql不对劲竟然用的是OPENJSON最后查了一下国外相关文章发现是EF8.0改了生成SQL的包含逻辑。由于使用的s......
  • EF Core 中避免 SQL 注入的三种写法
    SQL注入攻击可能会对我们的应用程序产生严重影响,导致敏感数据泄露、未经授权的访问和应用程序受损。EFCore提供了三种内置机制来防止SQL注入攻击。1、利用LINQ查询语法和参数化查询,这是比较推荐的做法。awaitusingvarcontext=newPostgresContext();varauthor=......
  • Adobe Lightroom Classic (LRC)桌面图像编辑和管理软件下载安装(附win/mac安装包)
    目录一、软件简介1.1定义与用途1.2核心功能1.3非破坏性编辑二、下载与安装2.1下载2.2安装三、系统要求3.1操作系统3.2处理器与内存3.3硬盘空间3.4显卡与显示器一、软件简介1.1定义与用途AdobeLightroomClassic(简称LRC)是一款专为数码摄影师、图形......
  • RBE104TC C/C++ Programming Language
    RBE104TCC/C++ProgrammingLanguageAssignment1ContributiontotheOverallMarks30%IssueDateSubmissionDeadline13thOctober2024AssignmentOverview:ThisassignmentisgearedtowardsassessingfundamentalcodingconceptsinC/C++andinitiatingthep......
  • Golang中接口和结构体之间转换的方法
    目录接口转结构体结构体转接口使用ok-idiom进行安全的类型断言在Golang中,接口和结构体之间的转换涉及到类型断言和类型断言的操作符。接口转结构体如果我们有一个接口变量,并且我们知道它的内部具体类型,我们可以使用类型断言来将其转换为该具体类型的结构体。packagemain......
  • 游戏《黑神话:悟空》突然崩溃:如何有效解决游戏黑神话悟空的AkFlanger.dll错误
    一、前言《黑神话:悟空》以其惊人的画面品质、精彩的剧情和深度的玩法,成为了众多玩家期待的游戏大作。然而,当玩家们沉浸在这个神秘的神话世界中时,游戏突然崩溃并出现AkFlanger.dll错误,这无疑会让人感到非常沮丧。那么,我们该如何有效解决这个问题呢?二、了解AkFlanger.dll......