firebase / firebase-admin-java

Firebase Admin Java SDK
https://firebase.google.com/docs/admin/setup
Apache License 2.0
525 stars 255 forks source link

ServerValues.resolveDeferredValue has incorrect cast #962

Open chrylis opened 2 weeks ago

chrylis commented 2 weeks ago

As ServerValue.increment 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)
google-oss-bot commented 2 weeks ago

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.