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

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的类路径中:

  1. Atlassian的HttpClient API在Confluence 9版本中发生了包路径或类结构变更,旧的com.atlassian.httpclient.api包下的类已被迁移或移除
  2. 即使尝试转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:19:51