質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Java

    14055questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Redmine

    201questions

    Redmineは、プロジェクトのタスク管理、進捗管理、情報共有が可能な、 オープンソースプロジェクト管理ソフトウェアです。

Redmineのチケットを完了分も含めてCSV出力するJavaプログラムを作成したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,935

javabigineer

score 73

Redmineのチケットをすべて取得するプログラムを作成しましたが、
ステータスが完了のチケットは出力されません。
ステータスが完了のチケットも含めて出力する方法はないでしょうか?

補足:使用しているAPIはtaskadapterです。

以下、現状のソースです。
import com.taskadapter.redmineapi.IssueManager;
import com.taskadapter.redmineapi.RedmineException;
import com.taskadapter.redmineapi.RedmineManager;
import com.taskadapter.redmineapi.RedmineManagerFactory;
import com.taskadapter.redmineapi.bean.CustomField;
import com.taskadapter.redmineapi.bean.Issue;
import com.taskadapter.redmineapi.bean.IssueFactory;
import com.taskadapter.redmineapi.bean.Project;
import com.taskadapter.redmineapi.bean.ProjectFactory;
import com.taskadapter.redmineapi.bean.Tracker;
import com.taskadapter.redmineapi.bean.TrackerFactory;
import com.taskadapter.redmineapi.bean.User;

  public List<Issue> getAllIssues(String projectKey) throws RedmineException { 
             flgChk(); 

            System.out.println("■■■チケットを全件取得します。■■■"); 
             List<Issue> issues = issueMgr.getIssues(projectKey, null); // 第二引数はなくてもよい? 

            System.out.println("チケットの件数 : " + issues.size()); 
             issues.stream().forEach(is -> { 
                 System.out.println("【案件番号】" + is.getSubject()); 
             }); 
             return issues; 
         } 

        public Issue getOneIssue(String projectKey, String subject) throws RedmineException { 
             flgChk(); 
             System.out.println("■■■チケットを1件取得します。■■■"); 
             List<Issue> issues = issueMgr.getIssues(projectKey, null); // 第二引数はなくてもよい? 

            // チケットの探索(無かったらnull) 
             Optional<Issue> is = issues.stream().filter(i ->(i.getSubject().equals(subject))).findAny(); 
             if(is.isPresent()){ 
                 System.out.println("【題名】" + is.get().getSubject()); 
                 return is.get(); 
             } 
             System.out.println("チケットは取得できませんでした。" ); 
             return null; 
         } 
     }

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • A-pZ

    2016/03/23 09:37

    RedmineのAPIを利用するライブラリ(ないしはjarファイル)の情報があると、明確な答えがでるかと思います。

    キャンセル

回答 2

+1

まずはRedmineのAPIについてですが、GET /issues.xmlでオープンな状態のIssueを取得できます。クローズしたものも含めて取得したい場合はGET /issues.xml?status_id=*とする必要があります。
Rest Issues - Redmine

status_id: get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id

おそらくはtaskadapter/redmine-java-api: Redmine Java APIを使用されているかと思われるのでこれ前提で。
Issueのリストを取得する場合、getIssues(Map<String, String> parameters)getIssues(String projectKey, Integer queryId, Include... include)を使用します。後者ではstatus_idを指定できなないので、getIssues(Map<String, String> parameters)project_idstatus_idをMapで渡してやることで取得できると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

方法としては2点あります。どれを選ぶか?は状況に応じて選ぶ感じです。

1.RedmineAdapterAPI(Java)側での呼び出し方を変える。

2.Redmine側でカスタムクエリを作成して、RedmineAdapaterAPI(Java)に渡す。
カスタムクエリの作成方法はざっくりと。
プロジェクト一覧→全てのチケットを表示→保存でプロジェクトをまたいだカスタムクエリとして保存されます。
プロジェクト一覧→全てのチケットを表示→保存でプロジェクト限定のカスタムクエリとして保存されます。

サンプルソースをのせておきます。
終了、却下でもIssueが取れることを確認済です。

RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
IssueManager issueManager = redmineManager.getIssueManager();
{
  // 呼び出し方法を変える場合。
  Map<String, String> params = new HashMap<>();
  ProjectManager projectManager = redmineManager.getProjectManager();
  params.put("project_id", projectManager.getProjectByKey("sandbox").getId().toString());
  params.put("status_id", "*");
  List<Issue> issues = issueManager.getIssues(params);
  for (Issue issue : issues) {
    log.info(issue.getStatusName());
  }
}
{
  // 全てのチケットを表示で保存したカスタムクエリのIDが1の場合。
  List<Issue> issues = issueManager.getIssues(null, 1);
  for (Issue issue : issues) {
    log.info(issue.getStatusName());
  }
}
{
  // プロジェクト選択→チケットで保存したカスタムクエリのIDが2の場合。
  List<Issue> issues = issueManager.getIssues("sandbox", 2);
  for (Issue issue : issues) {
    log.info(issue.getStatusName());
  }
}

`

 動作確認環境

 サーバー

Redmine 3.2.0 with sqlite
ruby-2.2.4-x64-mingw32

 クライアント

JDK8 u73
eclipse mars2
com.taskadapter:redmine-java-api:2.6.0 

参考資料

Redmine REST API
Redmine REST API(非公式日本語、若干古い)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/23 11:33

    呼び出し方法を変える場合で試してみたところ、最新の25件しか取得できませんでした。全件取得はできないのでしょうか?

    キャンセル

  • 2016/03/23 12:00 編集

    デフォルトのlimit設定が25なので25件取れる感じになります。
    とりあえずでよければ、以下のように設定を追加すれば1万件までとれます。
    params.put("limit","10000");

    件数が多くて逐次処理を行うような形であれば、「total_count」「offset」「limit」の組み合わせで、分けて取得する感じになると思います。
    「com.taskadapter.redmineapi.internal.Transport.getObjectsList(java.lang.Class<T>, java.util.Collection<? extends org.apache.http.NameValuePair>)」あたりが参考になるかと。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14055questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Redmine

    201questions

    Redmineは、プロジェクトのタスク管理、進捗管理、情報共有が可能な、 オープンソースプロジェクト管理ソフトウェアです。