Confluence Data Center中Promise失效及ClassNotFound问题求助
解决Confluence 9中Pusher集成的ClassNotFound问题
问题背景
在Confluence 9中尝试集成Pusher功能,因Atlassian限制无法使用官方Java API,自行编写代码后出现ClassNotFound错误,涉及代码如下:
import com.atlassian.httpclient.api.HttpClient; import com.atlassian.httpclient.api.Request; import com.atlassian.util.concurrent.Promise; import com.atlassian.httpclient.api.Response; import com.atlassian.httpclient.api.ResponsePromise; private Promise<Response> sendPusherEvent(String channel, String event, String message) { long timestamp = System.currentTimeMillis() / 1000; String body = "{\"name\":\"" + event + "\", \"channel\":\"" + channel + "\", \"data\":\"" + message + "\"}"; String signature = generateSignature(body, timestamp); String url = "https://" + cluster + ".pusher.com/apps/" + appId + "/events" + "?auth_key=" + key + "&auth_timestamp=" + timestamp + "&auth_version=1.0&auth_signature=" + signature; // Create and execute request correctly ResponsePromise requestBuilder = httpClient.newRequest(url, "application/json", body).post(); // FIX: Convert ResponsePromise to Promise<Response> return requestBuilder; }
问题分析
ClassNotFound错误的核心原因是导入的类不在Confluence 9的类路径中:
- Atlassian的HttpClient API在Confluence 9版本中发生了包路径或类结构变更,旧的
com.atlassian.httpclient.api包下的类已被迁移或移除 - 即使尝试转换
ResponsePromise到Promise<Response>,类不存在的问题会优先触发错误,转换尝试无效
修复方案
1. 修正依赖与导入路径
Confluence 9使用的HttpClient组件已更新,需替换为兼容的导入路径:
- 移除旧的
com.atlassian.httpclient.api.*导入,改用com.atlassian.httpclient.apache.httpcomponents下的类 - 确保插件pom.xml中Confluence相关依赖使用
provided范围,避免依赖冲突
2. 调整HttpClient调用代码
以下是兼容Confluence 9的修正代码:
import com.atlassian.httpclient.apache.httpcomponents.DefaultHttpClient; import com.atlassian.util.concurrent.Promise; import com.atlassian.httpclient.api.Response; import com.atlassian.httpclient.api.Request; private Promise<Response> sendPusherEvent(String channel, String event, String message) { long timestamp = System.currentTimeMillis() / 1000; // 使用StringBuilder避免字符串拼接安全问题 StringBuilder bodyBuilder = new StringBuilder(); bodyBuilder.append("{\"name\":\"").append(event) .append("\", \"channel\":\"").append(channel) .append("\", \"data\":\"").append(message).append("\"}"); String body = bodyBuilder.toString(); String signature = generateSignature(body, timestamp); String url = "https://" + cluster + ".pusher.com/apps/" + appId + "/events" + "?auth_key=" + key + "&auth_timestamp=" + timestamp + "&auth_version=1.0&auth_signature=" + signature; // 使用Confluence 9兼容的HttpClient构建请求 Request request = new Request.Builder(url) .setMethod("POST") .setHeader("Content-Type", "application/json") .setEntity(body) .build(); return DefaultHttpClient.newInstance().execute(request); }
3. 处理Promise转换(若仍需)
如果ResponsePromise在兼容版本中存在但无法直接返回,尝试调用其toPromise()方法完成转换:
return requestBuilder.toPromise();
4. 排查具体缺失类
查看atlassian-confluence.log中明确的缺失类名,针对性调整导入或依赖:
- 若缺失
com.atlassian.util.concurrent.Promise,确认Confluence的atlassian-util-concurrent依赖已正确引入 - 确保插件打包时未包含Atlassian提供的核心依赖,避免类加载冲突
内容的提问来源于stack exchange,提问作者Matti Kiviharju
相关产品推荐
相关产品推荐

