diff --git a/cmvr-iot-test/pom.xml b/cmvr-iot-test/pom.xml
index 71cb3e6..1e3cb61 100644
--- a/cmvr-iot-test/pom.xml
+++ b/cmvr-iot-test/pom.xml
@@ -34,6 +34,10 @@
com.cmvr
cmvr-iot-grpc-client
+
+ com.cmvr
+ cmvr-iot-grpc-lib
+
diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/message/TaskNodeExecuteMessage.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/message/TaskNodeExecuteMessage.java
index 974355b..0c5bd59 100644
--- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/message/TaskNodeExecuteMessage.java
+++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/message/TaskNodeExecuteMessage.java
@@ -99,7 +99,7 @@ public class TaskNodeExecuteMessage {
private List runtimeAssignments = new ArrayList<>();
/** 节点参数名到真实设备ID的解析结果。 */
- private JSONObject resolvedDeviceBindings = new JSONObject();
+ private JSONObject resolvedDeviceBindings;
/**
* 节点入参
diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java
index 803f5b7..488edc4 100644
--- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java
+++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java
@@ -87,6 +87,10 @@ public class FlowActionExecutorService {
private String executeEdgeOperateAction(ActionEnum action, FlowActionRequestVO req) {
TaskNodeExecuteMessage message = buildSingleNodeMessage(action, req.getPayload());
+ if (edgeOperateServices == null) {
+ // Keep manually constructed legacy callers working outside the Spring container.
+ return executeEdgeAction(action, req);
+ }
for (EdgeOperateService service : edgeOperateServices) {
if (service.supports(action)) {
return resultToString(service.execute(message));