From caa31778ef5457951317fc6d00ca2dbe49e25ba2 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Tue, 10 Mar 2026 13:07:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(workflow):=20=E8=A7=A3=E5=86=B3Dubbo?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=AE=89=E5=85=A8=E9=99=90=E5=88=B6?= =?UTF-8?q?=E4=B8=8B=E7=9A=84VO=E5=AF=B9=E8=B1=A1=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加BeanUtil依赖用于对象转换 - 引入LinkedHashMap、Collection、ArrayList支持 - 实现sanitizeMap方法对返回数据进行安全序列化处理 - 添加sanitizeValue递归处理嵌套数据结构 - 提供isDubboSafeValue判断基础类型安全性 - 避免consumer端因VO对象反序列化失败导致的问题 --- .../dubbo/RemoteWorkflowServiceImpl.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java index 3c3fee85..e9b05a27 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.dubbo; +import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; import org.dromara.workflow.api.RemoteWorkflowService; @@ -8,8 +9,7 @@ import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.service.WorkflowService; -import java.util.List; -import java.util.Map; +import java.util.*; /** * RemoteWorkflowServiceImpl @@ -50,7 +50,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { @Override public Map flowHisTaskList(String businessId) { - return workflowService.flowHisTaskList(businessId); + // Dubbo 严格序列化白名单下,业务模块 VO 不能直接跨服务返回;这里统一转换成 JDK 基础集合,避免 consumer 端反序列化失败 + return sanitizeMap(workflowService.flowHisTaskList(businessId)); } @Override @@ -97,4 +98,45 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { return workflowService.startCompleteTask(startProcess); } + @SuppressWarnings("unchecked") + private Map sanitizeMap(Map source) { + if (source == null || source.isEmpty()) { + return source; + } + Map target = new LinkedHashMap<>(source.size()); + source.forEach((key, value) -> target.put(key, sanitizeValue(value))); + return target; + } + + private Object sanitizeValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Map mapValue) { + Map target = new LinkedHashMap<>(mapValue.size()); + mapValue.forEach((key, item) -> target.put(String.valueOf(key), sanitizeValue(item))); + return target; + } + if (value instanceof Collection collectionValue) { + List target = new ArrayList<>(collectionValue.size()); + for (Object item : collectionValue) { + target.add(sanitizeValue(item)); + } + return target; + } + if (isDubboSafeValue(value)) { + return value; + } + return sanitizeMap(BeanUtil.beanToMap(value, new LinkedHashMap<>(), false, true)); + } + + private boolean isDubboSafeValue(Object value) { + return value instanceof String + || value instanceof Number + || value instanceof Boolean + || value instanceof Character + || value instanceof java.util.Date + || value.getClass().isEnum(); + } + }