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库
- 定位ColdFusion安装目录下的
lib文件夹(默认路径:C:\ColdFusion2023\cfusion\lib)。 - 移除或重命名旧的Guava JAR文件(文件名通常为
guava-*.jar)。 - 将FCM SDK依赖的对应版本Guava JAR(如
guava-31.1-jre.jar)复制到该目录。 - 重启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
相关产品推荐
相关产品推荐

