Dieses Jahr hatte ich die Gelegenheit, Folgendes mit der "Redmine REST API" zu tun:
Ich habe noch nie zuvor die Redmine REST-API verwendet und bei der Implementierung gelernt. Ich möchte, dass Sie uns mitteilen, wovon Sie süchtig waren, und die Fallen vermeiden, von denen ich süchtig war.
Redmine Version
Environment:
Redmine version 3.4.6.stable
java Version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
pom.xml
<dependency>
<groupId>com.taskadapter</groupId>
<artifactId>redmine-java-api</artifactId>
<version>4.0.0.preview.1</version>
</dependency>
Generieren Sie zuerst die RedmineManager-Klasse, um die Redmine REST-API zu verwenden. Verwenden Sie zu diesem Zeitpunkt "API KEY".
RedmineManager manager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);
Dieser "API-Schlüssel" wird jedem Redmine-Benutzer gegeben. Zu diesem Zeitpunkt waren meine Benutzerrechte keine Administratorrechte. Einige API-Methoden erfordern Redmine-Systemadministratorrechte.
Holen Sie sich alle Benutzer
/**
* Load list of users from the server.
* <p><strong>This operation requires "Redmine Administrator" permission.</strong>
* <p>
* This method calls Redmine with "include = memberships,groups" parameter.
*
* @return list of User objects
* @throws RedmineAuthenticationException invalid or no API access key is used with the server, which
* requires authorization. Check the constructor arguments.
* @throws NotFoundException
* @throws RedmineException
*/
public List<User> getUsers() throws RedmineException {
return transport.getObjectsList(User.class, new BasicNameValuePair(
"include", "memberships,groups"));
}
Wenn Sie es flexibel verwenden möchten, empfehlen wir Ihnen, über Systemadministratorrechte zu verfügen.
Es scheint ein Konzept zu sein, das aus Version 4 oder höher von "redmine-java-api" stammt. Es kann von der RedmineManager-Klasse bezogen werden.
RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);
Transport transport = redmineManager.getTransport();
Ohne "Transport" wird beim Erstellen / Aktualisieren eines Tickets die Ausnahme "Transport ist nicht gesetzt!" Ausgelöst. Setzen Sie also "Transport" auf die Instanz von "Issue", bevor Sie es erstellen / aktualisieren.
Erstellen Sie ein neues Ticket
//Transport einstellen
Issue issue = new Issue(manager.getTransport());
//(Weggelassen)
issue = issue.create();
Vorhandenes Ticket aktualisieren
Issue issue = manager.getIssueManager().getIssueById(fetchedIssue.getTicketId());
//Transport einstellen
issue.setTransport(manager.getTransport());
//(Weggelassen)
issue.update();
Params
benutztWenn Sie ein vorhandenes Ticket aktualisieren, möchten Sie möglicherweise ein "Ticket erhalten, das diese Bedingung erfüllt". In diesem Fall kann "diese Bedingung" mit "Params" ausgedrückt werden.
Der Titel des Tickets lautet"actual.getFileName"Bedingung, die übereinstimmt
Params().add("set_filter", "1")
.add("f[]", "subject")
.add("op[subject]", "=")
.add("v[subject][]", actual.getFileName());
Ich war süchtig nach den folgenden drei Punkten.
Ich konnte das Dokument nicht finden und habe es mit brutaler Gewalt identifiziert. Wenn Sie die gewünschten Bedingungen im Ticketlistenfilter festlegen, werden die Filterbedingungen als URL-Parameter angezeigt. Sie können den Wert des Schlüssels bestimmen, indem Sie die Parameter dekodieren.
Analysieren Sie mit der oben beschriebenen Methode.
Die aktuelle Situation ist unbekannt. Wenn jemand weiß, wie das geht, lass es mich wissen.
Rufen Sie das benutzerdefinierte Feld des vorhandenen Tickets einmal ab und aktualisieren Sie den Wert. Danach musste ich "clearCustomFields" löschen und dann die benutzerdefinierten Felder des vorhandenen Tickets hinzufügen, um es erfolgreich zu aktualisieren.
//Dieser Prozess ruft das benutzerdefinierte Feld aus dem vorhandenen Ticket ab, aktualisiert es und gibt es zurück.
Collection<CustomField> customFieldCollection = setEachCustomField(issue, fetchedIssue);
issue.clearCustomFields();
issue.addCustomFields(customFieldCollection);
yyyy-MM-dd
ist eine Option. Andernfalls wird ein Analysefehler angezeigt.
Oben (Ich werde es hinzufügen, wenn ich darauf komme.)