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,提问作者منى
相关产品推荐
相关产品推荐

