From 164f3fe7b50ecb9d2ab3eb7eb8af13d4698cff88 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 23 Sep 2026 17:58:15 +0800
Subject: [PATCH] fix(gateApi): 解决枚举定义不完整导致的反序列化异常
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 26 +++++++++++++++++++-------
1 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
index 6612d63..0d0b369 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -188,13 +188,19 @@
}
/**
- * 构建容错的 JSON 序列化器,跳过 {@code finishAs} 字段的反序列化。
+ * 构建容错的 JSON 序列化器,跳过部分枚举不完整字段的反序列化。
*
- * <p>gate-api SDK 的 {@code FuturesOrder.FinishAsEnum} 枚举不完整,缺少
- * {@code price_rate_proteced}(价格保护)等 Gate 实际会返回的值。反序列化未知
- * 枚举值时 {@code fromValue} 会抛 {@link IllegalArgumentException},导致已成功
- * 提交的订单被误判为失败(如日志 {@code Unexpected value 'price_rate_proteced'})。
- * 业务不使用 finishAs 字段,因此通过 Gson 排除策略直接跳过其解析。
+ * <p>gate-api SDK 的枚举定义滞后于交易所实际返回值,反序列化未知枚举值时
+ * {@code fromValue} 会抛 {@link IllegalArgumentException},导致接口被误判为失败。
+ * 已确认业务不使用以下字段,因此通过 Gson 排除策略直接跳过其解析:
+ * <ul>
+ * <li>{@code finishAs}:{@code FuturesOrder.FinishAsEnum} 缺少
+ * {@code price_rate_protected}(价格保护)等值(如日志
+ * {@code Unexpected value 'price_rate_proteced'});</li>
+ * <li>{@code posMarginMode}:{@code FuturesPriceTriggeredOrder.PosMarginModeEnum}
+ * 只定义 {@code cross}/{@code dual},而 {@code cancelPriceTriggeredOrderList}
+ * 会返回组合值 {@code cross|dual}(如日志 {@code Unexpected value 'cross|dual'})。</li>
+ * </ul>
*/
private static JSON buildLenientJson() {
JSON json = new JSON();
@@ -202,7 +208,13 @@
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
- return "finishAs".equals(f.getName());
+ if ("finishAs".equals(f.getName())) {
+ return true;
+ }
+ // 仅跳过 FuturesPriceTriggeredOrder 的 posMarginMode,避免误伤
+ // FuturesOrder / Position 的同名字段(二者语义为 isolated/cross)
+ return "posMarginMode".equals(f.getName())
+ && FuturesPriceTriggeredOrder.class.equals(f.getDeclaringClass());
}
@Override
--
Gitblit v1.9.1