开启数据审计功能后mybatis-plus插件DataChangeRecorderInnerInterceptor出现bug

Blade 未结 1 45

一、该问题的重现步骤是什么?

1、在配置中开启数据审计模式之后

blade.mybatis-plus.record-mode=true

image.png

2. 业务服务中执行以下sql报错

@Update("UPDATE a_story SET collect_count = collect_count + #{count} WHERE id = #{storyId}")
int increaseCollectCount(@Param("storyId") Long storyId, @Param("count") int count);


image.png

3.


二、你期待的结果是什么?实际看到的又是什么?

数据审计功能不报错。 目前是通过临时关闭数据审计功能,配置 blade.mybatis-plus.record-mode=false 解决。


后续对于这个数据审计功能是否会有修复计划


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


目前使用的是  blade-starter-mybatis     4.7.0.RELEASE


四、请提供详细的错误堆栈信息,这很重要。

详细错误堆栈:

2026-01-07 22:31:37.356  INFO 7020 --- [ntContainer#0-1] e.p.i.DataChangeRecorderInnerInterceptor : {"tableName":"a_story_like","operation":"insert","recordStatus":"true","changedData":[{"USER_ID":"null->1123598821738675201","ID":"null->2008909391600332802","CREATE_TIME":"null->Wed Jan 07 22:31:37 CST 2026","UPDATE_TIME":"null->Wed Jan 07 22:31:37 CST 2026","STORY_ID":"null->202512240002"}],"cost(ms)":5}
2026-01-07 22:31:37.463 ERROR 7020 --- [ntContainer#0-1] e.p.i.DataChangeRecorderInnerInterceptor : try to get record tobe updated for selectStmt=SELECT like_count, id FROM a_story WHERE id = ?

org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='storyId', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
  at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:92) ~[mybatis-3.5.19.jar:3.5.19]
  at com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor.buildOriginalObjectData(DataChangeRecorderInnerInterceptor.java:559) ~[mybatis-plus-jsqlparser-3.5.14.jar:3.5.14]
  at com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor.processUpdate(DataChangeRecorderInnerInterceptor.java:247) ~[mybatis-plus-jsqlparser-3.5.14.jar:3.5.14]
  at com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor.beforePrepare(DataChangeRecorderInnerInterceptor.java:156) ~[mybatis-plus-jsqlparser-3.5.14.jar:3.5.14]
  at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:102) ~[mybatis-plus-extension-3.5.14.jar:3.5.14]
  at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.19.jar:3.5.19]
  at jdk.proxy2/jdk.proxy2.$Proxy314.prepare(Unknown Source) ~[na:na]
  at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.19.jar:3.5.19]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.19.jar:3.5.19]
  at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.14.jar:3.5.14]
  at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.19.jar:3.5.19]
  at jdk.proxy2/jdk.proxy2.$Proxy313.update(Unknown Source) ~[na:na]
  at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.19.jar:3.5.19]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) ~[mybatis-spring-3.0.5.jar:3.0.5]
  at jdk.proxy2/jdk.proxy2.$Proxy186.update(Unknown Source) ~[na:na]
  at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:234) ~[mybatis-spring-3.0.5.jar:3.0.5]
  at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:64) ~[mybatis-plus-core-3.5.14.jar:3.5.14]
  at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156) ~[mybatis-plus-core-3.5.14.jar:3.5.14]
  at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93) ~[mybatis-plus-core-3.5.14.jar:3.5.14]
  at jdk.proxy2/jdk.proxy2.$Proxy222.increaseLikeCount(Unknown Source) ~[na:na]
  at com.aiapp.drama.modules.dramarelated.mq.StoryMessageConsumer.handleStoryLikeMessage(StoryMessageConsumer.java:109) ~[classes/:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) ~[spring-aop-6.2.11.jar:6.2.11]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.2.11.jar:6.2.11]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.2.11.jar:6.2.11]
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) ~[spring-tx-6.2.11.jar:6.2.11]
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.2.11.jar:6.2.11]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.2.11.jar:6.2.11]
  at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) ~[spring-aop-6.2.11.jar:6.2.11]
  at com.aiapp.drama.modules.dramarelated.mq.StoryMessageConsumer$$SpringCGLIB$$0.handleStoryLikeMessage() ~[classes/:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.11.jar:6.2.11]
  at org.springframework.amqp.rabbit.listener.adapter.KotlinAwareInvocableHandlerMethod.doInvoke(KotlinAwareInvocableHandlerMethod.java:45) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.11.jar:6.2.11]
  at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:80) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:274) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:221) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:148) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1694) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1616) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1604) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1595) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListenerAndHandleException(AbstractMessageListenerContainer.java:1540) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1521) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1091) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1027) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1431) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1331) ~[spring-rabbit-3.2.7.jar:3.2.7]
  at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
  at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:75) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:90) ~[mybatis-3.5.19.jar:3.5.19]
  ... 64 common frames omitted
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
  at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:75) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.type.UnknownTypeHandler.setNonNullParameter(UnknownTypeHandler.java:71) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:73) ~[mybatis-3.5.19.jar:3.5.19]
  ... 65 common frames omitted
Caused by: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:81) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:55) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1480) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1495) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.mysql.cj.jdbc.ClientPreparedStatement.setLong(ClientPreparedStatement.java:1778) ~[mysql-connector-j-9.4.0.jar:9.4.0]
  at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setLong(FilterChainImpl.java:3314) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.filter.FilterAdapter.preparedStatement_setLong(FilterAdapter.java:1249) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setLong(FilterChainImpl.java:3311) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.filter.FilterAdapter.preparedStatement_setLong(FilterAdapter.java:1249) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setLong(FilterChainImpl.java:3311) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.setLong(PreparedStatementProxyImpl.java:463) ~[druid-1.2.27.jar:na]
  at com.alibaba.druid.pool.DruidPooledPreparedStatement.setLong(DruidPooledPreparedStatement.java:311) ~[druid-1.2.27.jar:na]
  at org.apache.ibatis.type.LongTypeHandler.setNonNullParameter(LongTypeHandler.java:30) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.type.LongTypeHandler.setNonNullParameter(LongTypeHandler.java:26) ~[mybatis-3.5.19.jar:3.5.19]
  at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:73) ~[mybatis-3.5.19.jar:3.5.19]
  ... 67 common frames omitted

2026-01-07 22:31:37.468  INFO 7020 --- [ntContainer#0-1] e.p.i.DataChangeRecorderInnerInterceptor : {"tableName":"a_story","operation":"update","recordStatus":"true","changedData":[{"STORYID":"null->202512240002","LIKE_COUNT":"null->1"}],"cost(ms)":8}
2026-01-07 22:31:37.564  INFO 7020 --- [ntContainer#0-1] c.a.d.m.d.mq.StoryMessageConsumer        : 批量剧情点赞入库成功: 1 条


五、若有更多详细信息,请在下面提供。

1条回答
  •  admin
    admin (楼主)
    1天前

    数据审计功能底层用的是mybatis-plus官方的数据变动插件,他只能对自己内部封装好的API查询进行识别。


    这个插件暂不支持自定义sql,需要等mybatis-plus官方支持才可以。或者等官方不维护这个组件后,我们会根据开发进度排期重新自己开发一套底层逻辑。

    0 讨论(0)
提交回复