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

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

ただいまの
回答率

90.38%

  • Java

    16479questions

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

  • Redmine

    227questions

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

JavaでRedmineのチケット更新処理 カスタムフィールドが更新されない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,288

javabigineer

score 74

Java言語でRedmineのチケット更新処理を作成しています。
以下のようにコーディングしており、①の処理を記述しなければ更新自体は行われます。(更新日時が更新される)
しかし、更新したいカスタムフィールドが更新されません。
デバッグしたところ、カスタムフィールドの値がtmpissueに入っていないからだとわかり、①を追加しました。(前処理にてカスタムフィールドの値はセットしています)
しかし、①を記述すると下記エラー内容が発生してしまいます。
なにかいい実現方法をおしえてください。
【ソース】
//更新フラグ=trueの場合
                // 更新処理
                int ticketid = Integer.parseInt(bean.getTikectID());
                // IDを指定して更新
                Issue tmpissue = issueMgr.getIssueById(ticketid);
                ①tmpissue.addCustomFields(customs);
                issueMgr.update(tmpissue);
                System.out.println("チケットを更新しました。案件番号:" + tmpissue.getSubject());

【エラー】
com.taskadapter.redmineapi.RedmineInternalError: Unexpected JSONException
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.toSimpleJSON(RedmineJSONBuilder.java:142)
    at com.taskadapter.redmineapi.internal.Transport.updateObject(Transport.java:276)
    at com.taskadapter.redmineapi.IssueManager.update(IssueManager.java:256)
    at csvImport.TicketClient.putIssue(TicketClient.java:162)
    at csvImport.csvImport.main(csvImport.java:248)
Caused by: org.json.JSONException: Duplicate key "19"
    at org.json.JSONObject.putOnce(JSONObject.java:1313)
    at org.json.JSONWriter.key(JSONWriter.java:208)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.writeCustomFields(RedmineJSONBuilder.java:302)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.writeIssue(RedmineJSONBuilder.java:241)
    at com.taskadapter.redmineapi.internal.Transport$$Lambda$3/2143437117.write(Unknown Source)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.toSimpleJSON(RedmineJSONBuilder.java:138)
    ... 4 more

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

Caused by: org.json.JSONException: Duplicate key "19" と表示されていることから、すでに tmpissue に19番のカスタムフィールドがあるところに、tmpissue.addCustomFields(customs) で、同じ番号のカスタムフィールドが追加されているようです。

Redmine の Java API って、これですか?

  • https://github.com/taskadapter/redmine-java-api

だとすると、この問題は、こちらで修正された ようです。2年ほど前に修正されたようですが、もしかして、その修正がされていない、古いバージョンの Java API を使っているのではないでしょうか? もしそうなら、最新のバージョンを使ってみてください。


2016年3月9日追記

redmine-java-api をソースコードからコンパイルしているのですかね。うーん、エラーの内容は変わってないので、上に書いた redmine-java-api 自体の問題が直ってないのかもしれません。もし私の手元に Redmine の環境があれば、試してみることができるのですが...。

念のため、作者の方が作成した、バージョン 2.6.0 の jar で試してみてください。Maven セントラルリポジトリというサイトからダウンロードできます。

redmine-java-api-2.6.0.jar をダウンロードしてください。

ところで、本題からそれますが、こういう外部ライブラリの依存関係の管理には、専用のツールを使うのがおすすめです。私が Java で開発していた頃(6年ほど前です)は、Apache Maven か、Apache Ant + Ivy が一般的でしたが、これから使うのなら Gradle がよさそうです。

これらを使うと、上の Maven セントラルリポジトリなどにアップされている jar ファイルの中から、必要なものを自動的にダウンロードできます。たとえば、redmine-java-api 2.6.0 を使いたい時に、その jar ファイルだけでなく、redmine-java-api が必要とする他のライブラリ(例:slf4j-api や httpclient)もダウンロードしてくれます。

参考になりそうな記事を紹介します。

これらの記事の、「ライブラリの依存関係」と書かれているあたりを読んでみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/09 10:56

    新しいAPIをダウンロードしましたが、以下のエラーが出ました。
    ダウンロードは更新されていたクラスのソースのみです。(←これではだめ?)

    com.taskadapter.redmineapi.RedmineInternalError: Unexpected JSONException
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.toSimpleJSON(RedmineJSONBuilder.java:143)
    at com.taskadapter.redmineapi.internal.Transport.updateObject(Transport.java:276)
    at com.taskadapter.redmineapi.IssueManager.update(IssueManager.java:256)
    at csvImport.TicketClient.putIssue(TicketClient.java:168)
    at csvImport.csvImport.main(csvImport.java:248)
    Caused by: org.json.JSONException: Duplicate key "25"
    at org.json.JSONObject.putOnce(JSONObject.java:1313)
    at org.json.JSONWriter.key(JSONWriter.java:208)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.writeCustomFields(RedmineJSONBuilder.java:303)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.writeIssue(RedmineJSONBuilder.java:242)
    at com.taskadapter.redmineapi.internal.Transport$$Lambda$3/654582261.write(Unknown Source)
    at com.taskadapter.redmineapi.internal.RedmineJSONBuilder.toSimpleJSON(RedmineJSONBuilder.java:139)
    ... 4 more

    キャンセル

  • 2016/03/09 21:20

    うーん、ダメでしたか。redmine-java-api の jar ファイルのダウンロード方法などについて、回答の方に追記しました。

    キャンセル

  • 2016/03/10 14:24

    jarをダウンロードしてビルドパスに追加してみたら、エラーがでなくなりました!
    ご丁寧にありがとうございました。
    更新はされるのですが、カスタムフィールドはいまだに更新されません。。

    キャンセル

+1

すでに解決されているかもしれませんが、こちらで使っていたサンプルを貼り付けておきます。
CustomeFiledのIDが登録する課題にないと更新されません。エラーにはならないです。
肝心の更新する場合が抜けていたので追記しました。

public void createIssue() throws RedmineException {
        // Redmineマネージャー生成。
        RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
        // プロジェクト名からプロジェクトを取得。
        ProjectManager projectManager = redmineManager.getProjectManager();
        Project project = projectManager.getProjectByKey("sandbox");
        // 課題作成
        Issue issue = IssueFactory.create(project.getId(), "test123");
        issue.setProject(project);
        // バージョンをプロジェクトに設定されている文字列から登録。
        Version version = VersionFactory.create(project,"0.0.1");
        issue.setTargetVersion(version);
        // カテゴリーをプロジェクトに設定されている文字列から登録。
        IssueCategory issueCategory = IssueCategoryFactory.create(project, "調査");
        issue.setCategory(issueCategory);
        // カスタムフィールド設定の名前を元にIDを取得。
        CustomFieldManager customFieldManager = redmineManager.getCustomFieldManager();
        List<CustomFieldDefinition> customFieldDefinitions = customFieldManager.getCustomFieldDefinitions();
        int customFiledId = 0;
        for (CustomFieldDefinition customFieldDefinition : customFieldDefinitions) {
            if("発生バージョン".equals(customFieldDefinition.getName())){
                customFiledId = customFieldDefinition.getId();
            }
        }
        // カスタムフィールド登録。
        CustomField customField = CustomFieldFactory.create(customFiledId);
        customField.setValue("0.0.0");
        issue.addCustomField(customField);

        // 課題をRedmineサーバーに登録。
        IssueManager issueManager = redmineManager.getIssueManager();
        issueManager.createIssue(issue);
    }
apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {

    compile 'org.slf4j:slf4j-api:1.7.14'
    compile 'com.taskadapter:redmine-java-api:2.6.0'
    compile 'ch.qos.logback:logback-classic:1.1.6'

    testCompile 'junit:junit:4.12'
}

追記:更新する場合

public void updateIssue() throws RedmineException {
        // Redmineマネージャー生成。
        RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
        // 課題取得。
        IssueManager issueManager = redmineManager.getIssueManager();
        // 課題番号を元に取得。
        Issue issue = issueManager.getIssueById(3);
        // カスタムフィールド設定。
        CustomField customField = issue.getCustomFieldByName("発生バージョン");
        customField.setValue("0.0.1");

        // 課題をRedmineサーバーに登録。
        issueManager.update(issue);
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Java

    16479questions

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

  • Redmine

    227questions

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