fix(workflow): 解决Dubbo序列化安全限制下的VO对象传递问题

- 添加BeanUtil依赖用于对象转换
- 引入LinkedHashMap、Collection、ArrayList支持
- 实现sanitizeMap方法对返回数据进行安全序列化处理
- 添加sanitizeValue递归处理嵌套数据结构
- 提供isDubboSafeValue判断基础类型安全性
- 避免consumer端因VO对象反序列化失败导致的问题
dev
zangch@mesnac.com 6 days ago
parent 202131d2fe
commit caa31778ef

@ -1,5 +1,6 @@
package org.dromara.workflow.dubbo; package org.dromara.workflow.dubbo;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.workflow.api.RemoteWorkflowService; 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.api.domain.RemoteStartProcessReturn;
import org.dromara.workflow.service.WorkflowService; import org.dromara.workflow.service.WorkflowService;
import java.util.List; import java.util.*;
import java.util.Map;
/** /**
* RemoteWorkflowServiceImpl * RemoteWorkflowServiceImpl
@ -50,7 +50,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
@Override @Override
public Map<String, Object> flowHisTaskList(String businessId) { public Map<String, Object> flowHisTaskList(String businessId) {
return workflowService.flowHisTaskList(businessId); // Dubbo 严格序列化白名单下,业务模块 VO 不能直接跨服务返回;这里统一转换成 JDK 基础集合,避免 consumer 端反序列化失败
return sanitizeMap(workflowService.flowHisTaskList(businessId));
} }
@Override @Override
@ -97,4 +98,45 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
return workflowService.startCompleteTask(startProcess); return workflowService.startCompleteTask(startProcess);
} }
@SuppressWarnings("unchecked")
private Map<String, Object> sanitizeMap(Map<String, Object> source) {
if (source == null || source.isEmpty()) {
return source;
}
Map<String, Object> 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<String, Object> target = new LinkedHashMap<>(mapValue.size());
mapValue.forEach((key, item) -> target.put(String.valueOf(key), sanitizeValue(item)));
return target;
}
if (value instanceof Collection<?> collectionValue) {
List<Object> 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();
}
} }

Loading…
Cancel
Save