firebase / firebase/firebase-admin-java

ServerValues.resolveDeferredValue has incorrect cast

未關閉
#962 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
api: database
主要語言
Java
星號
620
分支
305
平均合併
3 小時 23 分鐘
30 天內合併 PR
1

描述

* Operating System version: Gentoo Linux
* Firebase SDK version: 9.3.0
* Library version: 9.3.0 (but the bug goes back to at least 8.1.0)
* Firebase Product: RTDB

As [ServerValue.increment](firebase-admin-java#961) is still not supported by this SDK 4 years after its introduction, I tried implementing it manually. This triggers a `ClassCastException` inside the SDK due to a bad assumption that the value of the `.sv` key is always a `String`.

#### Steps to reproduce:

1. Create the data structure for ServerValue.increment as described in documentation (such as the REST documentation):
```
{
".sv": {
"increment": delta
}
}
```

2. Call `setValue` using this data structure.

#### Relevant Code:
```
var node = databaseNode();
node.setValue(Map.of(".sv", Map.of("increment", delta)), callback);
```

#### Error:

```
2024-06-21T19:58:12,008Z [firebase-database-worker] ERROR c.g.firebase.database.core.RunLoop - Uncaught exception in Firebase Database runloop (9.3.0). Please report to firebase-database-client@google.com
java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.lang.String (java.util.HashMap and java.lang.String are in module java.base of loader 'bootstrap')
at com.google.firebase.database.core.ServerValues.resolveDeferredValue(ServerValues.java:44)
at com.google.firebase.database.core.ServerValues.resolveDeferredValueSnapshot(ServerValues.java:80)
at com.google.firebase.database.core.Repo.setValue(Repo.java:376)
at com.google.firebase.database.DatabaseReference$1.run(DatabaseReference.java:305)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
```

貢獻指南

開啟貢獻指南

研究方向

從 ServerValues.java:44 中的 ServerValues.resolveDeferredValue 開始,經由 ServerValues.resolveDeferredValueSnapshot 和 Repo.setValue 追蹤其呼叫者。使用文件中所述的 map 形式 .sv 增量值,透過 DatabaseReference.setValue 重現該失敗。當此輸入不再因回報的 ClassCastException 而失敗,且已根據 issue 的重現步驟檢查行為時,即表示完成。

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

評估

技術堆疊
firebase, java
領域
databases
Issue 類型
缺陷
難度
3/5
預估耗時
1-2 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
45/100

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

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