jira java接口生成问题

参考页面:

可方便扩展的JIRA Rest Web API的封装调用

JIRA是一个缺陷跟踪管理系统,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时,可以调用他的API。

JIRA本身的API非常强大,但它是一个底层的API体系,并不是一个易用的接口,如果要开发和拓展,所以需要我们二次包装。

jira官方为解决这个问题,推出了方便强大的java client library(目前只有java客户端库,没有.Net类库)

jira的Rest API  最新文档官网.

JIRA 6.4.12 REST API documentation

https://docs.atlassian.com/jira/REST/latest/

JIRA REST API Tutorials:

https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials

JIRA Java Client library 

https://ecosystem.atlassian.net/wiki/display/JRJC/Home

(获取所有项目目的,获取projectKey,issuetype)

package jiraTEST;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import org.apache.commons.codec.binary.Base32;
import org.joda.time.DateTime;

import com.atlassian.jira.rest.client.IssueRestClient;
import com.atlassian.jira.rest.client.JiraRestClient;
import com.atlassian.jira.rest.client.SearchRestClient;
import com.atlassian.jira.rest.client.domain.BasicIssue;
import com.atlassian.jira.rest.client.domain.BasicProject;
import com.atlassian.jira.rest.client.domain.BasicUser;
import com.atlassian.jira.rest.client.domain.Comment;
import com.atlassian.jira.rest.client.domain.Field;
import com.atlassian.jira.rest.client.domain.Issue;
import com.atlassian.jira.rest.client.domain.Project;
import com.atlassian.jira.rest.client.domain.SearchResult;
import com.atlassian.jira.rest.client.domain.Transition;
import com.atlassian.jira.rest.client.domain.input.ComplexIssueInputFieldValue;
import com.atlassian.jira.rest.client.domain.input.FieldInput;
import com.atlassian.jira.rest.client.domain.input.IssueInput;
import com.atlassian.jira.rest.client.domain.input.IssueInputBuilder;
import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory;
import com.atlassian.util.concurrent.Promise;
import com.google.common.collect.Lists;

public class CvteJiraDemo {

public static String BaseURL = "http://jira-test:8080/";
public static String User = "admin";
public static String Password = "admin";
private static URI jiraServerUri = URI
.create("http://jira-test/rest/api/2/");
private static boolean quiet = false;
private static final long BUG_TYPE_ID = 1L; // JIRA magic value
private static final long TASK_TYPE_ID = 3L; // JIRA magic value
private static final DateTime DUE_DATE = new DateTime();
private static final String PRIORITY = "Trivial";
private static final String DESCRIPTION = "description";

 

public static void main(String[] args) throws InterruptedException,
ExecutionException {

final AsynchronousJiraRestClientFactory factory = new AsynchronousJiraRestClientFactory();
URI jiraServerUri;
try {
jiraServerUri = new URI(BaseURL);
final JiraRestClient restClient = (JiraRestClient) factory
.createWithBasicHttpAuthentication(jiraServerUri, User,
Password);
getAllProjects(restClient);
getProject(restClient, "DEMO");
getIssue(restClient, "FEEDBACK-14");
getIssueFields(restClient, "FEEDBACK-27");
addIssue(restClient, "FEEDBACK", "AAAAB");
addIssueComplex(restClient, "FEEDBACK",DUE_DATE.toString());

} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

}
}

private static void println(Object o) {
if (!quiet) {
System.out.println(o);
}
}

private static void parseArgs(String[] argsArray) throws URISyntaxException {
final List<String> args = Lists.newArrayList(argsArray);
if (args.contains("-q")) {
quiet = true;
args.remove(args.indexOf("-q"));
}

if (!args.isEmpty()) {
jiraServerUri = new URI(args.get(0));
}
}

private static Transition getTransitionByName(
Iterable<Transition> transitions, String transitionName) {
for (Transition transition : transitions) {
if (transition.getName().equals(transitionName)) {
return transition;
}
}
return null;
}

// 得到所有项目信息
private static void getAllProjects(final JiraRestClient restClient)
throws InterruptedException, ExecutionException {
try {

Promise<Iterable<BasicProject>> list = restClient
.getProjectClient().getAllProjects();
Iterable<BasicProject> a = list.get();
Iterator<BasicProject> it = a.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

} finally {
}
}

// 得到单一项目信息
private static void getProject(final JiraRestClient restClient,
String porjectKEY) throws InterruptedException, ExecutionException {
try {

Project project = restClient.getProjectClient()
.getProject(porjectKEY).get();
System.out.println(project);

} finally {
}
}

// 得到单一问题信息
private static void getIssue(final JiraRestClient restClient,
String issueKEY) throws InterruptedException, ExecutionException {
try {

Promise<Issue> list = restClient.getIssueClient()
.getIssue(issueKEY);
Issue issue = list.get();
System.out.println(issue);

} finally {
}
}

// 创建问题
public static BasicIssue createIssue(final JiraRestClient jiraRestClient,
IssueInput newIssue) {
BasicIssue basicIssue = jiraRestClient.getIssueClient()
.createIssue(newIssue).claim();
return basicIssue;
}

//添加备注到问题
public static void addCommentToIssue(final JiraRestClient jiraRestClient,Issue issue, String comment) {
IssueRestClient issueClient = jiraRestClient.getIssueClient();
issueClient.addComment(issue.getCommentsUri(), Comment.valueOf(comment)).claim();
}


//删除问题,目前找不到对应API
public static void deleteIssue(final JiraRestClient jiraRestClient, Issue issue) {
IssueRestClient issueClient = jiraRestClient.getIssueClient();
//issueClient.deleteIssue(issue.getKey(), false).claim();
}

//通过标题获取问题
public static Iterable findIssuesByLabel(final JiraRestClient jiraRestClient, String label) {
SearchRestClient searchClient = jiraRestClient.getSearchClient();
String jql = "labels%3D"+label;
com.atlassian.jira.rest.client.domain.SearchResult results = ((SearchRestClient) jiraRestClient).searchJql(jql).claim();
return results.getIssues();
}

//通过KEY获取问题
public static Issue findIssueByIssueKey(final JiraRestClient jiraRestClient, String issueKey) {
SearchRestClient searchClient = jiraRestClient.getSearchClient();
String jql = "issuekey = \"" + issueKey + "\"";
SearchResult results = searchClient.searchJql(jql).claim();
return (Issue) results.getIssues().iterator().next();
}

// 创建问题 :仅有简单问题名称
private static void addIssue(final JiraRestClient restClient,
String porjectKEY, String issueName) throws InterruptedException,
ExecutionException {
try {
IssueInputBuilder builder = new IssueInputBuilder(porjectKEY,
TASK_TYPE_ID, issueName);
builder.setDescription("issue description");
final IssueInput input = builder.build();

try {
// create issue
final IssueRestClient client = restClient.getIssueClient();
final BasicIssue issue = client.createIssue(input).claim();
final Issue actual = client.getIssue(issue.getKey()).claim();
System.out.println(actual);
} finally {
if (restClient != null) {
// restClient.close();
}
}

} finally {
}
}

// 创建问题 :包含自定义字段
private static void addIssueComplex(final JiraRestClient restClient,
String porjectKEY, String issueName) throws InterruptedException,
ExecutionException {
try {
IssueInputBuilder builder = new IssueInputBuilder(porjectKEY,
TASK_TYPE_ID, issueName);
builder.setDescription("issue description");
// builder.setFieldValue("priority", ComplexIssueInputFieldValue.with("name", PRIORITY));
//单行文本
builder.setFieldValue("customfield_10042", "单行文本测试");

//单选字段
builder.setFieldValue("customfield_10043", ComplexIssueInputFieldValue.with("value", "一般"));

//数值自定义字段
builder.setFieldValue("customfield_10044", 100.08);

//用户选择自定义字段
builder.setFieldValue("customfield_10045", ComplexIssueInputFieldValue.with("name", "admin"));
//用户选择自定义字段(多选)
Map<String, Object> user1 = new HashMap<String, Object>();
user1.put("name", "admin");
Map<String, Object> user2 = new HashMap<String, Object>();
user2.put("name", "wangxn");
ArrayList peoples = new ArrayList();
peoples.add(user1);
peoples.add(user2);
builder.setFieldValue("customfield_10047", peoples);

//设定父问题
Map<String, Object> parent = new HashMap<String, Object>();
parent.put("key", "FEEDBACK-25");
FieldInput parentField = new FieldInput("parent", new ComplexIssueInputFieldValue(parent));
builder.setFieldInput(parentField);

final IssueInput input = builder.build();
try {
final IssueRestClient client = restClient.getIssueClient();
final BasicIssue issue = client.createIssue(input).claim();
final Issue actual = client.getIssue(issue.getKey()).claim();
System.out.println(actual);
} finally {
if (restClient != null) {
// restClient.close();
}
}

} finally {
}
}


//获取问题的所有字段
private static void getIssueFields(final JiraRestClient restClient,
String issueKEY) throws InterruptedException, ExecutionException {
try {

Promise<Issue> list = restClient.getIssueClient()
.getIssue(issueKEY);
Issue issue = list.get();
Iterable<Field> fields = issue.getFields();
Iterator<Field> it = fields.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

} finally {
}
}

}

 

转载于:https://www.cnblogs.com/antime/p/9437880.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pmd 使用笔记

pmd是一块开源的代码静态分析工具&#xff0c;使用java编写&#xff0c;可以自定义规则来进行自己想要的分析。pmd可以单独使用&#xff0c;也可以作为idea、eclipse的插件使用。它的规则分为xpath规则&#xff0c;和java规则。https://pmd.github.io/ pmd内部工作机制比较简单…

css用一张大图片来设置背景的技术真相

之前就知道了用一张图片来设置页面内的所有背景的技术。原理很简单&#xff0c;利用background-potision精确地定位到图片的位置。好处是减少页面 的http请求数。 老实说&#xff0c;我并不觉得这个技术有多值得推广。虽然是减少了http请求数&#xff0c;但对于99%的网站来说&…

flex 平铺布局_flex布局及各种布局的总结

Flexbox display: flex;如果也想设置内联元素为弹性盒子&#xff0c;可以使用display:inline-flex;实现三种其他布局难以达到的效果&#xff1a;在父内容里面垂直居中一个块内容。使容器的所有子项占用等量的可用宽度/高度&#xff0c;而不管有多少宽度/高度可用。使多列布局中…

计算机网络应用押韵句,现代汉语练习题

第一章导论一、填空题1、汉语做为一种语言&#xff0c;具有一切语言共有的性质。即从内部结构上说&#xff0c;它是一种音译结合的符号系统&#xff1b;从外部功能上说&#xff0c;它是人类社会重要的交际工具和思维工具。2、语言符号最重要的特点是任意性和线条性。3、“现代汉…

Python中 sys.argv[]的用法简明解释

Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数&#xff0c;且一直在IDLE上编辑了后运行&#xff0c;试图从结果发现它的用途&#xff0c;然而结果一直都是没结果&#xff0c;也在网上查了许多&#xff0c;但发现这个问题的比…

在Apache Hadoop(多节点群集)中运行Map-Reduce作业

我们将在这里描述在多节点集群中的Apache Hadoop中运行MapReduce Job的过程。 要在多节点群集中设置Apache Hadoop &#xff0c;可以阅读设置Apache Hadoop多节点群集 。 为了进行设置&#xff0c;我们必须在每台计算机上使用以下配置Hadoop&#xff1a; 在所有节点的conf / …

写出完美CSS代码的5个重要方面

每个人都可以编写CSS代码&#xff0c;甚至你现在已经让它为你的项目工作了。我在博客中也一直与大家讨论&#xff0c;学习CSS编码与CSS技巧。但是CSS还 可以更好吗&#xff1f;开始用这5个Tips改进你的CSS吧&#xff01; 一、关于 CSS重置 首先&#xff0c;很认真的告诉你&…

文件上传漏洞及其绕过、对策、过狗

1. 文件包含上传&#xff1a; php://input属于php内置的封装协议&#xff0c;其实都主要是include&#xff08;&#xff09;函数处理不当如果有文件是以下写法&#xff0c;xxx随便&#xff1a;<?phpinclude($_GET[xxx]);?> 以上保存到test.php&#xff0c; 我们访问ht…

一维二维_更高效的一维、二维材料过渡态搜索

前言本文中&#xff0c;我们首先介绍如何使用NEB方法搜索过渡态&#xff0c;以及在NEB的结果的基础上&#xff0c;进一步提高精度优化出高精度、可验证的过渡态。本文以MoS2的一维条带(其中一个Mo原子被Co替代掺杂)为例进行演示。一般来说&#xff0c;这种反应&#xff0c;周期…

2013年测试基于Web的Spring应用程序(第1部分)

2013年测试基于Web的Spring应用程序&#xff08;第1部分&#xff09; LJCer和TDD / BDD的一位拥护者最近开始使用广受欢迎的Spring堆栈开发应用程序&#xff0c;他就如何最好地在这种情况下实施测试驱动的方法向我提出了建议。 我开始回覆一封电子邮件作为回应&#xff0c;但后…

计算机类课程嵌入式系统的特点及其应用,嵌入式系统的准确定义、特点及其重要性...

嵌入式计算机系统的出现&#xff0c;是现代计算机发展史上的里程碑事件。嵌入式系统诞生于微型计算机时代&#xff0c;与通用计算机的发展道路完全不同&#xff0c;形成了独立的单芯片的技术发展道路。由于嵌入式系统的诞生&#xff0c;现代计算机领域中出现了通用计算机与嵌入…

【Linux】cp命令

用途 cp除了复制功能之外还可以建立快捷方式 全称 cp的全称为copy 参数 -a :相当于同时指定参数pdr -d :若文件为链接文件的属性(link file),则复制链接文件属性而非档案本身 -f &#xff1a;强制的意思(force)&#xff0c;若目标档案已经存在且无法开启&#xff0c;则移除后再…

网页变成灰色,对重大事件表示哀悼

body * { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale1); filter: gray; } 兼容所有浏览器&#x…

Mybatis之逆向工程

前面几篇基本把mybatis简单使用学习了下,今天学习下mybatis逆向工程&#xff0c;我们在开发中经常需要先设计数据库表结构或者先设计model,那就是能不能有工具可以只需在一边设计之后另一边自动生成呢&#xff1f;于是逆向工程来了。这里的逆向功能是通过数据库的表生成java po…

2023航天推进理论基础考试划重点(W老师)-液体火箭发动机1

适用于期末周求生欲满满的西北工业大学学生。 1、液体火箭发动机的基本组成及功能是什么&#xff1f; 推力室组件、推进剂供应系统、阀门与调节器、发动机总装元件等组成。 2、液体火箭发动机的分类和应用是什么&#xff1f;3、液体火箭发动机系统、分系统的概念是什么&…

minio 并发数_c#(asp.net)线程配置总结

本文为大家介绍有关c#(asp.net)线程配置的相关知识&#xff0c;有需要的朋友可以参考下。同一时刻只能发起的工作线程数量。1、(maxWorkerThreads * CPU逻辑数量)-minFreeThreads比如2个CPU默认配置maxWorkerThreads100&#xff0c;minFreeThreads176&#xff0c;则同时最大只能…

Java EE 7是最终版本。 思想,见解和进一步的指针。

我们花了不到三年的时间才推出了下一个Java EE版本 。 今年4月16日&#xff0c; JCP EC对JSR 342进行了投票并获得批准。 这是一个成功的故事&#xff0c;因为在去年八月下旬的最后时刻撤消了拥有云就绪平台的最初想法。 作为EG的成员&#xff0c;撰写即将发布的功能或多或少容…

远程教育英语和计算机没过怎么办,网络教育英语统考能考几次 没考过怎么办?...

网络教育英语统考能考几次?网络教育统考是可以在学制期限内多次报考&#xff0c;直到考试合格为止。不过从2018年4月统考开始&#xff0c;所有考生只要一次弃考&#xff0c;弃考科目就只能再有3次报考机会(含以后的弃考)。网络教育统考每年有三次考试时间&#xff0c;分别是4、…

JavaScript的arguments及其子对象

首先一个最大的问题是&#xff0c;arguments这个对象哪儿来的&#xff1f;也许有人会认为它是调用函数时引擎自带的一个局部变量&#xff0c;因为我们平时使用arguments的时候都是在函数中把它当作局部变量来使用的。事实上arguments是Function实例的属性&#xff0c;只是在调用…

nginx 自动化定时切割日志

NG在默认情况下&#xff0c;是始终输出到一个日志文件中&#xff0c;日志文件在nginx.conf中 &#xff1a; access_log logs/www.access.log main; 一个文件中不是很方便查找&#xff0c;分析数据&#xff0c;因此需要按现实运维需要定时的对此文件进行切割。 1、准备个切割…