You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ColdFusion 2023使用FCM SDK批量订阅设备令牌报错求助

ColdFusion 2023中FCM批量订阅主题触发HTTP 500错误的解决方法

问题重现

在ColdFusion 2023中使用FCM SDK实现设备令牌批量订阅主题时,触发HTTP 500错误,错误信息如下:

com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor

简化实现代码:

<cfset FirebaseAdmin = createObject("java", "com.google.firebase.FirebaseApp") />
<cfset FirebaseMessaging = createObject("java", "com.google.firebase.messaging.FirebaseMessaging").getInstance(FirebaseAdmin) />

<cfset registrationTokens = ["token1", "token2", "token3"] />
<cfset topic = "/topics/news" />

<!--- Subscribing multiple tokens to a topic --->
<cfset response = FirebaseMessaging.subscribeToTopic(registrationTokens, topic) />

原因分析

该错误的核心是Guava版本冲突:ColdFusion 2023内置了旧版本的Guava库,而FCM Admin SDK依赖的高版本Guava中新增了MoreExecutors.directExecutor()方法,旧版本Guava不包含此方法,导致反射调用时失败,抛出错误。

解决方案

方案1:替换全局Guava库

  1. 定位ColdFusion安装目录下的lib文件夹(默认路径:C:\ColdFusion2023\cfusion\lib)。
  2. 移除或重命名旧的Guava JAR文件(文件名通常为guava-*.jar)。
  3. 将FCM SDK依赖的对应版本Guava JAR(如guava-31.1-jre.jar)复制到该目录。
  4. 重启ColdFusion服务使更改生效。

方案2:使用自定义类加载器隔离依赖

如果不想修改全局库,可以通过自定义类加载器优先加载FCM相关依赖,避免与内置库冲突。调整后的代码示例:

<!--- 定义FCM相关依赖JAR的存放路径 --->
<cfset jarPaths = [
    "C:\ColdFusion2023\cfusion\custom-lib\firebase-admin-9.2.0.jar",
    "C:\ColdFusion2023\cfusion\custom-lib\guava-31.1-jre.jar",
    "C:\ColdFusion2023\cfusion\custom-lib\firebase-common-9.2.0.jar",
    "C:\ColdFusion2023\cfusion\custom-lib\其他必要依赖.jar"
] />

<!--- 创建自定义URL类加载器 --->
<cfset urlList = [] />
<cfloop array="#jarPaths#" index="path">
    <cfset fileObj = createObject("java", "java.io.File").init(path) />
    <cfset arrayAppend(urlList, fileObj.toURI().toURL()) />
</cfloop>
<cfset urlClassLoader = createObject("java", "java.net.URLClassLoader").init(urlList, getPageContext().getClass().getClassLoader()) />

<!--- 通过自定义加载器加载Firebase类 --->
<cfset FirebaseAdminClass = urlClassLoader.loadClass("com.google.firebase.FirebaseApp") />
<cfset FirebaseMessagingClass = urlClassLoader.loadClass("com.google.firebase.messaging.FirebaseMessaging") />

<cfset FirebaseAdmin = FirebaseAdminClass.getInstance() />
<cfset FirebaseMessaging = FirebaseMessagingClass.getInstance(FirebaseAdmin) />

<cfset registrationTokens = ["token1", "token2", "token3"] />
<cfset topic = "/topics/news" />

<cfset response = FirebaseMessaging.subscribeToTopic(registrationTokens, topic) />

方案3:统一依赖版本

确保所有FCM相关依赖JAR的版本一致,避免版本不匹配引发的兼容问题。可以通过Maven或Gradle导出FCM Admin SDK的完整依赖树,将所有必要的JAR包统一版本后复制到ColdFusion的依赖目录中。

内容的提问来源于stack exchange,提问作者Piyush Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:20:54