From 15e93168b60899361d8621442fbf58a34fa1a288 Mon Sep 17 00:00:00 2001 From: lvxiaofei Date: Fri, 16 May 2025 15:05:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20UpdateChain=20=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BD=93=E7=B1=BB?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=97=B6=E5=81=B6=E5=8F=91=20ClassCastExcept?= =?UTF-8?q?ion=20=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/update/ModifyAttrsRecordProxyFactory.java | 9 ++++++++- .../com/mybatisflex/core/update/UpdateWrapper.java | 12 +++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java index 7157bcdf..774efcac 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java @@ -18,6 +18,7 @@ package com.mybatisflex.core.update; import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.util.ClassUtil; import com.mybatisflex.core.util.MapUtil; +import org.apache.ibatis.javassist.util.proxy.Proxy; import org.apache.ibatis.javassist.util.proxy.ProxyFactory; import org.apache.ibatis.javassist.util.proxy.ProxyObject; @@ -56,10 +57,16 @@ public class ModifyAttrsRecordProxyFactory { T proxyObject; try { proxyObject = (T) ClassUtil.newInstance(proxyClass); - ((ProxyObject) proxyObject).setHandler(new ModifyAttrsRecordHandler()); } catch (Exception e) { throw FlexExceptions.wrap(e, "请为实体类 %s 添加公开的无参构造器!", target.getCanonicalName()); } + if (proxyObject instanceof ProxyObject) { + ((ProxyObject) proxyObject).setHandler(new ModifyAttrsRecordHandler()); + } else if (proxyObject instanceof Proxy) { + ((Proxy) proxyObject).setHandler(new ModifyAttrsRecordHandler()); + } else { + throw FlexExceptions.wrap("为实体类 %s 设置字段更新处理器时出错,获取的实体类代理对象既不是 ProxyObject 的实例,也不是 Proxy 的实例", target.getCanonicalName()); + } return proxyObject; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/UpdateWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/UpdateWrapper.java index f59c6b41..26731856 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/UpdateWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/UpdateWrapper.java @@ -15,12 +15,15 @@ */ package com.mybatisflex.core.update; +import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.query.QueryColumn; import com.mybatisflex.core.query.QueryCondition; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; import com.mybatisflex.core.util.UpdateEntity; +import org.apache.ibatis.javassist.util.proxy.Proxy; +import org.apache.ibatis.javassist.util.proxy.ProxyFactory; import org.apache.ibatis.javassist.util.proxy.ProxyObject; import java.io.Serializable; @@ -32,7 +35,14 @@ import java.util.Map; public interface UpdateWrapper extends PropertySetter>, Serializable { default Map getUpdates() { - ModifyAttrsRecordHandler handler = (ModifyAttrsRecordHandler) ((ProxyObject) this).getHandler(); + ModifyAttrsRecordHandler handler = null; + if (this instanceof ProxyObject) { + handler = (ModifyAttrsRecordHandler) ((ProxyObject) this).getHandler(); + } else if (this instanceof Proxy) { + handler = (ModifyAttrsRecordHandler) ProxyFactory.getHandler((Proxy) this); + } else { + throw FlexExceptions.wrap("获取实体类代理对象 %s 的字段更新处理器时出错,该对象既不是 ProxyObject 的实例,也不是 Proxy 的实例", this.getClass().getName()); + } return handler.getUpdates(); }