fix(api): bump flymoon-payment-api 1.0.20260520 + enum-by-name serialization (LES-1184)
背景
Trial 用户在 SIT 上调 /agent/points/info 接口返回 500。根因:5/13 在 fly_moon_payment 加了 SubscriptionTypeEnum.trial(ordinal 2),但没 bump flymoon-payment-api 版本号 / 没重新发布 jar,fly_moon_agent(consumer)拉的还是 5/8 的 1.0.20260508,反序列化 ordinal=2 直接抛 No enum ordinal SubscriptionTypeEnum.2,所有读 AgentUserPointsVO / AgentSubscriptionVO 等含此枚举字段的 Dubbo 返回 VO 的 agent 端接口都会 500,首屏必调的 /agent/points/info 一定踩。
详情见 LES-1184 评论 d8a427ec LES-1184 → 跳转。
改动清单
-
flymoon-payment-api/pom.xml—<version>1.0.20260508→1.0.20260520 -
flymoon-payment-api/.../enums/SubscriptionTypeEnum.java— 加@JSONType(serializeFeatures = JSONWriter.Feature.WriteEnumsUsingName),wire 从 ordinal 切到名字 -
flymoon-payment-provider/pom.xml—flymoon-payment-api.version同步抬到1.0.20260520 -
flymoon-payment-provider/src/test/.../SubscriptionTypeEnumSerializationTest.java— 新增 4 个 case 钉住按名序列化(含 VO 端到端 roundtrip),防止之后再次回退
根因分析
-
Bug 表现:trial 用户调
/sit-api/agent/points/info→ 500,agent pod 抛org.apache.dubbo.rpc.RpcException: StatusRpcException: INTERNAL : Deserialize response failed ... fastjson2.JSONException: No enum ordinal com.flymoon.payment.api.domain.enums.SubscriptionTypeEnum.2 -
触发条件:用户
agent_subscription.current_subscription_type='trial'(即买过 7 天体验套餐),任意 Dubbo 调用返回含SubscriptionTypeEnum字段的 VO -
根因位置:
flymoon-payment-api/pom.xml:8— version 一直停在1.0.20260508(5/13 加枚举值的 commit814bcd3漏 bump) -
修复方案:
- 抬 api 版本号到
1.0.20260520,CI publish 到 Nexus 后 consumer 重新构建就能拿到含trial的新 jar - 在 enum 上加
@JSONType(WriteEnumsUsingName)全局按名序列化,wire 从2变成"trial"。fastjson2 默认会按名解析字符串 enum,所以即使下次再有新枚举值漏 bump,老 consumer 收到的会是清晰的No enum constant ... newvalue,不是诡异 ordinal 错误。
- 抬 api 版本号到
-
影响评估:
- 兼容性:本 MR 是 wire 格式破坏性变更(int→string)。fly_moon_agent 必须配套抬版本号到
1.0.20260520才能正确解析新 wire;否则老 jar 读到"trial"会抛No enum constant(依旧 500,但语义更清晰),不会读到错误的 monthly/annually。 - 部署顺序硬约束:必须先发布 payment-api 1.0.20260520 到 Nexus,再 build fly_moon_agent(见下方"线下验证 / 部署顺序")。
- 兼容性:本 MR 是 wire 格式破坏性变更(int→string)。fly_moon_agent 必须配套抬版本号到
测试
-
mvn -B test(flymoon-payment-provider) — 141/141 通过,含新增的SubscriptionTypeEnumSerializationTest4 个 case -
本地
mvn -B install出flymoon-payment-api-1.0.20260520.jar,flymoon-payment-provider用新 api 编译通过 -
fly_moon_agent 用本地新 api jar 编译通过(验证消费侧不会报
cannot find symbol)
线下验证 / 部署顺序
部署顺序硬依赖(请 Archiver 把控):
- 合本 MR 到
sit_0519→ Jenkins 构建fly_moon_payment→ CI publishflymoon-payment-api-1.0.20260520到 Nexus(如果 Jenkins job 没有mvn deploystep,需手动mvn deploy -pl flymoon-payment-api -am或加一个 publish step) - 配套 MR:
fly_moon_agent同 task-id 分支agent/claude-opus-4-7/2fc134(已开,见 fly_moon_agent!new)合入sit_0519→ Jenkins 构建fly_moon_agent→ pull 新 jar → 部署 S1 - 验证:trial 用户调
/sit-api/agent/points/info200,能正常看到积分
由于跨仓库部署顺序敏感(payment 必须先 publish jar),未在本 MR 内单独触发 Jenkins,等 Archiver 统一调度。
- 测试 URL:https://s1.jennie.im/find(trial 用户登录后访问)
- 触发用户:initial1wu+free@gmail.com(LES-1184 报告者)
相关
- Issue: LES-1184 [http://multica.deeplink.media/-/issues/420221d2-ed21-4950-8b91-71038d96b8e1]
- 配套 MR:
fly_moon_agent同分支agent/claude-opus-4-7/2fc134 - Agent-Task-Id: 20260520-2fc134