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(); + } + }