ListRecord.Field array-shaped `message` still fails in the production GsonFactory (follow-up to #1587)

未關閉 適合新手
#1,653 2 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
2/5
預估耗時
1-3 小時
新手友好度
74/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
java
領域
api

研究方向

從 GsonFactory.registerTypeAdapters 和 GsonListViewGroupingFactory 開始;issue 提議將 GsonListRecordFieldFactory 移至 slack-api-model/src/main/java/com/slack/api/util/json/,並在 production factory 中註冊它。查看現有的測試 adapter 和 ListRecordFieldTest,了解對單一物件和陣列的預期處理方式。production GsonFactory 能成功解析這兩種形式後,工作即告完成。

由索引模型根據 Issue 內容生成。

描述

Issue summary

When the Slack API returns a conversations.replies (or conversations.history) response that contains a Slack Lists item attachment, the SDK throws JsonSyntaxException whenever any ListRecord.Field.message value is a JSON array instead of a single object. The whole API call fails, and no Message data is returned.

This is the bug from #1587. #1590 (released in v1.49.0) closed #1587, but the bug is still in the production code path in v1.52.0.

Affected versions

  • v1.46.0 through v1.48.1 (verified in #1587; also seen in production on v1.48.1)
  • v1.49.0 through v1.52.0: the production GsonFactory has no adapter for ListRecord.Field. @maoppay saw the failure on v1.50.0 (comment in #1587), and the live probe in #1644 shows it too.

Why #1590 was not sufficient

#1590 changed two things:

  1. ListRecord.Field (slack-api-model/src/main). It added private transient List<Message> messages and getMessages() / setMessages(). The field message is still a single Message. Gson skips transient fields and sets fields by reflection, not through setters. So without an adapter, Gson still maps the JSON key message to the Message field, and an array still fails.
  2. GsonListRecordFieldFactory, the adapter that converts the array. #1590 put it in slack-api-model/src/test/java/test_locally/util/list/ and registered it only in the test GsonFactory (slack-api-model/src/test/java/test_locally/unit/GsonFactory.java).

ListRecordFieldTest parses with that test GsonFactory, so it passes. Real API calls parse with com.slack.api.util.json.GsonFactory in slack-api-client (MethodsClientImpl calls GsonFactory.createSnakeCase(config)), and that class does not register the adapter. Also, the json-logs/samples/api samples still have message as a single object, so the MockSlackApi tests (for example ConversationsTest) never see the array shape.

Minimal reproduction

import com.google.gson.Gson;
import com.slack.api.methods.response.conversations.ConversationsRepliesResponse;
import com.slack.api.util.json.GsonFactory;

public class Repro {
    public static void main(String[] args) {
        // Mirrors the shape Slack returns when a Lists item's `message` field
        // has multiple values (array form).
        String payload =
            "{\"ok\":true,\"messages\":[{\"type\":\"message\",\"user\":\"U1\",\"ts\":\"1.0\","
            + "\"text\":\"hi\",\"attachments\":[{\"list_record\":{\"record\":{\"fields\":["
            + "{\"key\":\"name\",\"message\":{\"text\":\"ok\"}},"
            + "{\"key\":\"details\",\"message\":[{\"text\":\"a\"},{\"text\":\"b\"}]}"
            + "]}}}]}]}";

        Gson sdkGson = GsonFactory.createSnakeCase();
        // Still throws JsonSyntaxException on v1.52.0 at
        // $.messages[0].attachments[0].list_record.record.fields[1].message
        ConversationsRepliesResponse parsed =
            sdkGson.fromJson(payload, ConversationsRepliesResponse.class);
    }
}

Expected behavior

The SDK accepts both single-object and array shapes for ListRecord.Field.message in real API responses, as getMessages() from #1590 intends.

Proposed fix

#1654 moves GsonListRecordFieldFactory to slack-api-model/src/main/java/com/slack/api/util/json/ (next to GsonListViewGroupingFactory) and registers it in GsonFactory.registerTypeAdapters.

主要語言
Java
星號
602
分支
237
平均合併
1 天 7 小時
30 天內合併 PR
13

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

slackapi/java-slack-sdk 的其他 Issue

查看 slackapi/java-slack-sdk 的全部 Issue

相似的 Issue

更多 Java Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。