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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Redmine

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

Q&A

解決済

2回答

6906閲覧

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

javabigineer

総合スコア87

Java

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

Redmine

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

0グッド

0クリップ

投稿2016/03/07 09:22

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

java

1 public void createIssue() throws RedmineException { 2 // Redmineマネージャー生成。 3 RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey); 4 // プロジェクト名からプロジェクトを取得。 5 ProjectManager projectManager = redmineManager.getProjectManager(); 6 Project project = projectManager.getProjectByKey("sandbox"); 7 // 課題作成 8 Issue issue = IssueFactory.create(project.getId(), "test123"); 9 issue.setProject(project); 10 // バージョンをプロジェクトに設定されている文字列から登録。 11 Version version = VersionFactory.create(project,"0.0.1"); 12 issue.setTargetVersion(version); 13 // カテゴリーをプロジェクトに設定されている文字列から登録。 14 IssueCategory issueCategory = IssueCategoryFactory.create(project, "調査"); 15 issue.setCategory(issueCategory); 16 // カスタムフィールド設定の名前を元にIDを取得。 17 CustomFieldManager customFieldManager = redmineManager.getCustomFieldManager(); 18 List<CustomFieldDefinition> customFieldDefinitions = customFieldManager.getCustomFieldDefinitions(); 19 int customFiledId = 0; 20 for (CustomFieldDefinition customFieldDefinition : customFieldDefinitions) { 21 if("発生バージョン".equals(customFieldDefinition.getName())){ 22 customFiledId = customFieldDefinition.getId(); 23 } 24 } 25 // カスタムフィールド登録。 26 CustomField customField = CustomFieldFactory.create(customFiledId); 27 customField.setValue("0.0.0"); 28 issue.addCustomField(customField); 29 30 // 課題をRedmineサーバーに登録。 31 IssueManager issueManager = redmineManager.getIssueManager(); 32 issueManager.createIssue(issue); 33 }

gradle

1apply plugin: 'java' 2 3repositories { 4 jcenter() 5} 6 7dependencies { 8 9 compile 'org.slf4j:slf4j-api:1.7.14' 10 compile 'com.taskadapter:redmine-java-api:2.6.0' 11 compile 'ch.qos.logback:logback-classic:1.1.6' 12 13 testCompile 'junit:junit:4.12' 14}

追記:更新する場合

java

1 public void updateIssue() throws RedmineException { 2 // Redmineマネージャー生成。 3 RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey); 4 // 課題取得。 5 IssueManager issueManager = redmineManager.getIssueManager(); 6 // 課題番号を元に取得。 7 Issue issue = issueManager.getIssueById(3); 8 // カスタムフィールド設定。 9 CustomField customField = issue.getCustomFieldByName("発生バージョン"); 10 customField.setValue("0.0.1"); 11 12 // 課題をRedmineサーバーに登録。 13 issueManager.update(issue); 14 }

投稿2016/03/12 15:12

編集2016/03/12 16:26
umed0025

総合スコア851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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/07 13:55

編集2016/03/09 12:19
tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javabigineer

2016/03/09 01: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
tatsuya6502

2016/03/09 12:20

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

2016/03/10 05:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問