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

从SOAP迁移到Jira REST API后无法获取完整Issue详情

Jira REST API迁移问题:无法获取完整Issue详情,但单个字段可正常返回

我们近期将WinForm项目中获取Jira单个Issue详情的代码从SOAP迁移至REST API后出现异常:点击刷新按钮无法获取指定Jira ID的完整Issue信息。项目基于Visual Studio 2019,使用NuGet包Atlassian.SDK 10.6.0,且已通过Insomnia和Postman验证凭证(云地址、用户名、作为密码的API Token)有效,SOAP方式下原代码可正常运行。

异常代码(无法获取完整Issue)

public Atlassian.Jira.Issue GetJiraDetails(string drNumber)
{
    try
    {
        // 需要用户名和密码凭证
        var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password);

        jira.Issues.MaxIssuesPerRequest = 9000;

        // 使用LINQ查询Issue
        var query = (from i in jira.Issues.Queryable
                        where i.Key == drNumber
                        select i).FirstOrDefault();

        return query;
    }
    catch (Exception ex)
    {
        return null;
    }
}

更新:单个字段查询可正常工作

尝试仅获取单个字段时代码能正常返回结果:

public DateTime? GetDateCreated(string drNumber)
{
    try
    {
        // 需要用户名和密码凭证
        var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password);

        jira.Issues.MaxIssuesPerRequest = 9000;

        // 使用LINQ查询创建日期字段
        var dateToSave = (from i in jira.Issues.Queryable
                          where i.Key == drNumber
                          select i.Created).FirstOrDefault();

        if (dateToSave != null)
            return ((DateTime)dateToSave).AddHours(-4);
    }
    catch (Exception ex)
    {
        throw (ex);
    }

    return null;
}

问题原因与解决方案

核心原因

Atlassian.SDK的REST实现中,通过Issues.Queryable查询完整Issue对象时,默认不会请求所有字段,部分字段需要显式加载;而查询单个字段时,SDK会自动仅请求该字段的数据,避免了字段缺失的问题。另外,原代码直接返回null的异常处理会掩盖具体错误信息,无法定位问题根源。

解决方案

  1. 直接通过Issue Key获取完整对象
    替换LINQ查询逻辑,使用SDK提供的GetIssueAsync方法直接获取完整Issue,该方法默认会加载所有必要字段:

    public Atlassian.Jira.Issue GetJiraDetails(string drNumber)
    {
        try
        {
            var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password);
            return jira.Issues.GetIssueAsync(drNumber).Result;
        }
        catch (Exception ex)
        {
            // 记录异常日志或抛出具体信息,便于排查
            Console.WriteLine($"获取Jira详情失败: {ex.Message}");
            throw;
        }
    }
    
  2. LINQ查询时显式扩展字段
    如果坚持使用LINQ查询,可通过Expand方法指定需要加载的字段,使用*表示加载所有字段,也可指定具体字段减少请求数据量:

    var query = (from i in jira.Issues.Queryable.Expand("*")
                 where i.Key == drNumber
                 select i).FirstOrDefault();
    
  3. 修复异常处理逻辑
    原代码捕获异常后直接返回null,无法得知具体错误(如权限不足、字段不存在、网络异常等)。建议改为记录异常日志并重新抛出,或返回包含错误信息的结果,方便问题排查。

  4. 检查API权限
    确认API Token对应的用户账号拥有查看该Issue所有字段的权限,部分敏感字段可能需要特定权限才能访问,导致完整Issue加载失败,但单个公开字段可正常返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:28