记录mybatis插件奇怪报错问题There is no getter for property named ‘delegate‘ in ‘class com.sun.proxy.$Proxy的排查

这篇具有很好参考价值的文章主要介绍了记录mybatis插件奇怪报错问题There is no getter for property named ‘delegate‘ in ‘class com.sun.proxy.$Proxy的排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景描述

项目要求update/delete必须要有where条件(因为出了一次生产上把一张表的数据全表删除的严重生产事故),并且要打印出where中的条件,所以考虑用mybatis拦截器处理

mybatis拦截器实现原理简述

there is no getter for property,mybatis,maven,java

在Mybatis中,拦截器可拦截如上图中四种相关操作类的操作方法。通过阅读源码可知,执行顺序为: Executor -> StatementHandler -> ParameterHandler -> StatementHandler -> ResultSetHandler

there is no getter for property,mybatis,maven,java

其中:StatementHandler类中包含针对query、update操作的具体拦截方法。因此,拦截基于StatementHandler类进行。

删除或更新拦截器SafeDeleteOrUpdateInterceptor部分代码

there is no getter for property,mybatis,maven,java

there is no getter for property,mybatis,maven,java

在加这个拦截器前,项目中还有一个针对select特殊字符处理的StatementHandler拦截器-MySqlInterceptor

there is no getter for property,mybatis,maven,java

执行sql时报错

there is no getter for property,mybatis,maven,java

 具体是在执行findById方法时报错,findById最后是调用到mybatis的selectOne方法报错。奇怪的是我本地在eclipse启动项目不会有这个报错,打成jar包就有这个报错?

二、开始排查

看报错信息,一开始没有什么头绪,因为是第一次遇到这种错,也是做各种尝试,先是在网上查了这个报错,大部分说是jar包冲突

2.1检查jar包冲突

先看项目中有没有mybatis的包冲突,发现没有there is no getter for property,mybatis,maven,java

 因为delete/update拦截器用到了github的jsqlparse,于是再检查jsqlparse的包有没有冲突,发现也没有

there is no getter for property,mybatis,maven,java

2.2既然没有jar包冲突,那应该是代码问题, 因为我本地不会报错不好调试,但是看报错信息应该是拦截器那里导致了问题,于是考虑分别注释掉其中一个拦截器试试

注释原来的MySqlInterceptor留下SafeDeleteOrUpdateInterceptor,没有报错,说明SafeDeleteOrUpdateInterceptor本身没什么问题

there is no getter for property,mybatis,maven,java

注释SafeDeleteOrUpdateInterceptor留下原来的MySqlInterceptor,也没有报错

there is no getter for property,mybatis,maven,java

 但是两个拦截器就会报错,然后去github上搜了下,找到一篇相关文章,说的是获取StatementHandler对象时的问题,于是考虑两个拦截器获取StatementHandler对象有什么不一样

MySqlInterceptor是直接强转

there is no getter for property,mybatis,maven,java

 SafeDeleteOrUpdateInterceptor是参照mybaits-plus PluginUtils的写法

there is no getter for property,mybatis,maven,java

there is no getter for property,mybatis,maven,java

既然mybatis-plus是如上的写法,于是考虑把MySqlInterceptor获取StatementHandler对象改成一样的。本地调试发现,确实存在invocation的target还是代理对象,因此需要进一步获取具体的对象

there is no getter for property,mybatis,maven,java

there is no getter for property,mybatis,maven,java

在只有其中的某一个拦截器时,invocation的target就是StatementHandler对象

there is no getter for property,mybatis,maven,java

 三、总结和思考

为什么同种对象如果存在多种拦截器对象时会出现invocation的target还是代理对象的情况,具体我也不是太清楚,没有具体研究源码,但是根据mybatis拦截器机制猜测,如果同种对象存在多种拦截器时,首先有个执行顺序,

四、为什么我本地不报错

原因尚不清楚

五、两个拦截器的执行顺序

在第3点中简要说到同种对象如果存在多种拦截器顺序问题,可参考同行总结的内容

there is no getter for property,mybatis,maven,java

there is no getter for property,mybatis,maven,java there is no getter for property,mybatis,maven,java

there is no getter for property,mybatis,maven,java 本地验证(gif动图)

plugin加载顺序验证

结果是先执行SafeDeleteOrUpdateInterceptor,再执行MySqlInterceptor。加载顺序的话应该就是先加载MySqlInterceptor再加载SafeDeleteOrUpdateInterceptor

结尾:如有不足,还请大家多多指出文章来源地址https://www.toymoban.com/news/detail-792062.html

到了这里,关于记录mybatis插件奇怪报错问题There is no getter for property named ‘delegate‘ in ‘class com.sun.proxy.$Proxy的排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 启动hdfs报错:Attempting to operate on hdfs namenode as root but there is no HDFS NAMENODE USER defined.

    配置好了hadoop的文件一启动就发现报错 这个问题呢,其实还是你的配置文件配错了,有两个配置文件的问题: core-site.xml文件 hadoop-env.sh 文件 这两个文件都是在hadoop软件下的etc/下的配置文件 其次可能还有就是你之前就配置过hadoop,并且还修改过环境变量的文件比如说/etc/p

    2023年04月19日
    浏览(48)
  • 【git】导入Git项目报错:XXX项目 is registered as a Git root, but no Git repositories were found there。

    idea导入项目出现这样的错误 选择打开的目录为Git根目录,但在那里找不到Git存储库。 退出,打开git上的根目录,然后点右下角import即可 点击右下角弹出窗口中的Configure 。这会在version contral (版本控制)选项卡上自动打开一个窗口。 也可以通过File-Settings进行访问。 选择列表

    2024年02月04日
    浏览(41)
  • java.sql.SQLException: There is no DataSource named ‘null‘

    当配置dataSource后,即使配置文件中已经指定了JobStoreTX,实际还是使用LocalDataSourceJobStore。 application.yml配置 修改之处如下:

    2024年02月13日
    浏览(31)
  • Git 分支跟踪There is no tracking information for the current branch.

    当你执行在develop分支上 git pull 返回提示: 解决办法,即按照提示: 查看本地分支的远端跟踪分支 要查看本地分支跟踪的远端分支,可以使用 git branch 命令搭配不同的选项。以下是一些常用的命令及其说明: 查看所有本地分支及对应的远端跟踪分支: 使用 -vv 选项可以显示

    2024年02月21日
    浏览(38)
  • 多种方法解决There is no tracking information for the current branch的错误

    今天发布某版本的项目,准备创建个 v0point1 分支,后期如果修改该版本,直接在该分支上修改即可。 首先,使用 git branch v0point1 命令,创建本地分支 v0point1 ,如下图所示: 其次,使用 git checkout v0point1 命令,切换到 v0point1 分支,如下图所示: 当然,我们也可以使用 git ch

    2024年02月09日
    浏览(37)
  • 处理 Code:516. Authentication failed: password is incorrect or there is no user with such name.

     在测试 ClickHouse 分布式表时,创建分布式表成功,但是查询数据时报错,如下: Received exception from server (version 22.2.2): Code: 516. DB::Exception: Received from 192.168.38.101:9000. DB::Exception: Received from 192.168.38.103:9000. DB::Exception: default: Authentication failed: pass word is incorrect or there is no user w

    2024年02月17日
    浏览(37)
  • Git出现There is no tracking information for the current branch提示的解决办法

    Git出现There is no tracking information for the current branch提示的解决办法 使用命令新建分支并切换到该分支 从远程获取代码 报错 There is no tracking information for the current branch. Please specify which branch you want to merge with. 意思是没有当前分支的追踪信息 解决: 以上两行命令可简写为 即将本

    2024年02月12日
    浏览(39)
  • [AxiosError]: There is no suitable adapter to dispatch the request since :- adapter xhr is not suppo

    最近在写一个node项目时,webpack打包之后运行打包的js文件报错:  [AxiosError]: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build     at we (C:UserslzzDocuments网盘脚本distbundle.js:2:32230)     at Ce.Se (C:Userslzz

    2024年02月03日
    浏览(41)
  • 报错问题修改 Vue 项目报错:‘$‘ is not defined ( no-undef )

    错误原因是不认识  $  符,他是  JQuery  中得符号,引入了  JQuery window.onload = function (){ onload = function (){ 第二种方法,改为 function del(obj){} , 则报错  del is not defined at HTMLAnchorElement.onclick 第三种方法改为 del = function(obj){},则也可以成功执行功能 onclick是要求全局函数  在

    2024年02月03日
    浏览(29)
  • Requested bean is currently in creation: Is there an unresolvable circular reference?(循环依赖报错)

    什么是循环依赖? 打个比方,你打电话给小明,小明也在打电话给你,此时电话里会说对方正在通话中,而上述报错就是这个”正在通话中“。代码含义就是:a中注入了b,b中又注入了a,就会触发循环依赖问题; 话不多说上代码: 解决方法: 在某一个类中添上@Lazy注解,该

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包