如何将select2选中值传递到Jira插件的Java后端代码中
实现方案
第一步:前端JS代码改造(AJAX传参)
你当前用的click事件不对,会在点击下拉框还没选值的时候就触发,建议换成change事件,选中值变化时才发起请求,改造后代码如下:
// 监听select2选中值变化事件 AJS.$('#select2-example2').on('change', function () { const selectedProjectKey = AJS.$(this).auiSelect2('val'); // 跳过空选中的情况 if (!selectedProjectKey) return; // 发起AJAX请求到后端REST接口 AJS.$.ajax({ // 路径要和后端REST配置一致,示例中的jira-issue-demo替换为你自己的插件key url: AJS.contextPath() + '/rest/jira-issue-demo/1.0/get-project-issues', type: 'POST', data: { projectKey: selectedProjectKey }, dataType: 'json', success: function (res) { if (res.success) { // 将返回的issue数据填充到datatable,#your-datatable-id替换为你自己的表格ID AJS.$('#your-datatable-id').DataTable().clear().rows.add(res.issues).draw(); } else { console.error('查询失败:', res.msg); } }, error: function (err) { console.error('请求接口失败', err); } }); });
第二步:后端Java REST端点实现
1. 先在插件配置文件atlassian-plugin.xml中添加REST模块声明
<rest key="rest-endpoint" path="jira-issue-demo" version="1.0"> <description>项目Issue查询REST接口</description> </rest>
注意上面的path属性值jira-issue-demo要和前端AJAX请求路径里的插件标识保持一致。
2. 编写REST接口Java类
import com.atlassian.jira.bc.issue.search.SearchService; import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.issue.Issue; import com.atlassian.jira.project.Project; import com.atlassian.jira.user.ApplicationUser; import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Path("/get-project-issues") @Produces({MediaType.APPLICATION_JSON}) public class ProjectIssueResource { @JiraImport private final SearchService searchService; // 构造注入Jira搜索服务 public ProjectIssueResource(SearchService searchService) { this.searchService = searchService; } @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response getIssuesByProjectKey(@FormParam("projectKey") String projectKey) { Map<String, Object> result = new HashMap<>(); List<Map<String, String>> issueList = new ArrayList<>(); try { // 获取当前登录用户 ApplicationUser currentUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); // 根据项目key查询项目 Project project = ComponentAccessor.getProjectManager().getProjectByKey(projectKey); if (project == null) { result.put("success", false); result.put("msg", "项目不存在"); return Response.ok(result).build(); } // 编写JQL查询项目下的所有Issue,可根据需求调整查询条件 String jql = "project = " + projectKey + " ORDER BY created DESC"; SearchService.ParseResult parseResult = searchService.parseQuery(currentUser, jql); if (parseResult.isValid()) { List<Issue> issues = searchService.search(currentUser, parseResult.getQuery(), SearchService.PAGER_UNLIMITED).getIssues(); // 封装前端需要的Issue键和摘要字段 for (Issue issue : issues) { Map<String, String> issueMap = new HashMap<>(); issueMap.put("key", issue.getKey()); issueMap.put("summary", issue.getSummary()); issueList.add(issueMap); } } result.put("success", true); result.put("issues", issueList); } catch (Exception e) { result.put("success", false); result.put("msg", e.getMessage()); } return Response.ok(result).build(); } }
注意事项
- 如果你的插件启用了Spring扫描,需要给上述REST类加
@Component注解,否则需要在atlassian-plugin.xml中手动注册该类 - datatable的列配置要和后端返回的
key、summary字段名对应,否则数据无法正常渲染 - 如果允许未登录用户访问该接口,可以在REST方法上加
@AnonymousAllowed注解
内容的提问来源于stack exchange,提问作者alimertkoc
相关产品推荐
相关产品推荐

