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

Jira中无法创建对应REST端点的片段,如何修复?

问题

我在Jira中创建了一个自定义Web项,期望点击菜单“Mouna Bulk Summary”后跳转到指定外部链接。已经配置了Web项和对应的REST端点,编写了Groovy脚本如下,但点击菜单后无响应,日志中看不到指定输出,还会跳转到错误页面。请帮忙修复这段REST端点代码使其正常工作。

import groovy.transform.BaseScript

import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate

import javax.ws.rs.core.MultivaluedMap

import com.atlassian.jira.component.ComponentAccessor

import com.onresolve.scriptrunner.runner.ScriptRunnerImpl

import com.atlassian.sal.api.ApplicationProperties

import com.atlassian.sal.api.UrlMode

import javax.ws.rs.core.Response

import org.apache.log4j.Logger

@BaseScript CustomEndpointDelegate delegate

 
callFeaturePerformanceImpactAnalysis(httpMethod: "GET") { MultivaluedMap queryParams ->

    def log = Logger.getLogger("atlassian-jira.log")

    log.warn("THIS IS MOUNA'S TEST")

    def user = ComponentAccessor.jiraAuthenticationContext?.loggedInUser

    def issue = ComponentAccessor.getIssueManager().getIssueObject(queryParams.getFirst("issueId") as Long)

    def baseUrl = ScriptRunnerImpl.getOsgiService(ApplicationProperties).getBaseUrl(UrlMode.ABSOLUTE)

    def redirectUrl = "https://secapps.eur.ad.sag:9888/FPIA/?iTrac=${issue.key}&reporter=${user.key}&baseURL=${baseUrl}"

    Response.temporaryRedirect(URI.create(redirectUrl)).build()

}
修复方案

针对你的问题,从代码和配置层面逐一排查并修复:

1. 确保Web项与REST端点的URL匹配

自定义Web项的跳转URL必须正确指向ScriptRunner的REST端点,格式应为:

/rest/scriptrunner/latest/custom/callFeaturePerformanceImpactAnalysis?issueId=${issue.id}
  • 确认Web项配置中,URL的路径部分与脚本中定义的端点名称callFeaturePerformanceImpactAnalysis完全一致
  • 必须传递issueId参数,否则代码中无法获取到issue对象,会直接抛出空指针异常

2. 增加空值校验,避免异常

代码中未对user和issue做空值判断,若用户未登录或issueId无效,会直接导致错误:

  • 检查loggedInUser是否为空,若为空返回401未授权
  • 检查issue是否为空,若为空返回404错误

3. 对URL参数进行编码

外部跳转URL中的参数(如baseUrl)可能包含特殊字符,未编码会导致URL无效,需要用URLEncoder.encode对参数值进行编码

4. 修复日志输出逻辑

原代码中Logger.getLogger("atlassian-jira.log")的写法错误,应该指定日志分类而非文件名,这样日志才能正确输出到Jira日志文件中

修改后的完整代码

import groovy.transform.BaseScript
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import javax.ws.rs.core.MultivaluedMap
import com.atlassian.jira.component.ComponentAccessor
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import com.atlassian.sal.api.ApplicationProperties
import com.atlassian.sal.api.UrlMode
import javax.ws.rs.core.Response
import org.apache.log4j.Logger
import java.net.URLEncoder

@BaseScript CustomEndpointDelegate delegate

callFeaturePerformanceImpactAnalysis(httpMethod: "GET") { MultivaluedMap queryParams ->
    // 修复日志实例获取方式
    def log = Logger.getLogger(this.class.name)
    log.warn("THIS IS MOUNA'S TEST - Endpoint triggered")

    // 校验登录用户
    def user = ComponentAccessor.jiraAuthenticationContext?.loggedInUser
    if (!user) {
        log.error("No logged in user found")
        return Response.status(Response.Status.UNAUTHORIZED).entity("Please log in first").build()
    }

    // 校验issueId参数并获取issue
    def issueIdStr = queryParams.getFirst("issueId")
    if (!issueIdStr) {
        log.error("Missing issueId parameter")
        return Response.status(Response.Status.BAD_REQUEST).entity("Missing issueId parameter").build()
    }

    def issue
    try {
        issue = ComponentAccessor.getIssueManager().getIssueObject(issueIdStr as Long)
    } catch (Exception e) {
        log.error("Invalid issueId: ${issueIdStr}", e)
        return Response.status(Response.Status.BAD_REQUEST).entity("Invalid issueId").build()
    }

    if (!issue) {
        log.error("Issue not found for id: ${issueIdStr}")
        return Response.status(Response.Status.NOT_FOUND).entity("Issue not found").build()
    }

    // 获取Jira基础URL并编码参数
    def baseUrl = ScriptRunnerImpl.getOsgiService(ApplicationProperties).getBaseUrl(UrlMode.ABSOLUTE)
    def encodedIssueKey = URLEncoder.encode(issue.key, "UTF-8")
    def encodedUserKey = URLEncoder.encode(user.key, "UTF-8")
    def encodedBaseUrl = URLEncoder.encode(baseUrl, "UTF-8")

    def redirectUrl = "https://secapps.eur.ad.sag:9888/FPIA/?iTrac=${encodedIssueKey}&reporter=${encodedUserKey}&baseURL=${encodedBaseUrl}"
    log.warn("Redirecting to: ${redirectUrl}")

    return Response.temporaryRedirect(URI.create(redirectUrl)).build()
}

额外检查项

  • 确认ScriptRunner插件版本与Jira版本兼容
  • 检查Jira的应用链接或防火墙设置是否允许跳转到目标外部地址
  • 查看Jira的atlassian-jira.log和ScriptRunner的日志,获取更详细的错误信息

内容的提问来源于stack exchange,提问作者منى

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:09:13