Cette année, j'ai eu l'occasion de faire ce qui suit avec la Redmine REST API
:
Je n'ai jamais utilisé Redmine REST API
auparavant, et j'ai appris en l'implémentant. J'aimerais que vous partagiez ce à quoi vous étiez accro et que vous évitiez les pièges auxquels j'étais accro.
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>
Générez d'abord la classe RedmineManager
pour utiliser l'API REST Redmine. À ce stade, utilisez quelque chose appelé ʻAPI KEY`.
RedmineManager manager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);
Cette ʻAPI KEY` est donnée à chaque utilisateur Redmine. À cette époque, mes droits d'utilisateur n'étaient pas des droits d'administrateur. Certaines méthodes d'API nécessitent des privilèges d'administrateur système Redmine.
Obtenez tous les utilisateurs
/**
* 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"));
}
Si vous souhaitez l'utiliser de manière flexible, nous vous recommandons de disposer des privilèges d'administrateur système.
Cela semble être un concept tiré de la version 4 ou plus récente de redmine-java-api
. Il peut être obtenu à partir de la classe RedmineManager
.
RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);
Transport transport = redmineManager.getTransport();
Sans Transport
, l'exception" Le transport n'est pas défini! "Est lancée lors de la création / mise à jour d'un ticket. Veuillez donc définir Transport
sur l'instance de ʻIssue` avant de créer / mettre à jour.
Créer un nouveau ticket
//Définir le transport
Issue issue = new Issue(manager.getTransport());
//(Omis)
issue = issue.create();
Mettre à jour le ticket existant
Issue issue = manager.getIssueManager().getIssueById(fetchedIssue.getTicketId());
//Définir le transport
issue.setTransport(manager.getTransport());
//(Omis)
issue.update();
Params
Lors de la mise à jour d'un ticket existant, vous souhaiterez peut-être obtenir un "ticket qui remplit cette condition". Dans ce cas, "cette condition" peut être exprimée en utilisant "Params".
Le titre du billet est"actual.getFileName"Condition qui correspond
Params().add("set_filter", "1")
.add("f[]", "subject")
.add("op[subject]", "=")
.add("v[subject][]", actual.getFileName());
J'étais accro aux trois points suivants.
Je n'ai pas trouvé le document, j'ai donc utilisé la force brute pour l'identifier. Si vous définissez les conditions souhaitées dans le filtre de liste de tickets, les conditions de filtre seront affichées en tant que paramètres d'URL. Vous pouvez déterminer la valeur de clé en décodant les paramètres.
Analysez par la méthode ci-dessus.
La situation actuelle est inconnue. Si quelqu'un sait comment faire cela, faites-le moi savoir.
Obtenez une fois le champ personnalisé du ticket existant et mettez à jour la valeur. Après cela, j'ai dû clearCustomFields
puis ajouter les champs personnalisés du ticket existant pour le mettre à jour avec succès.
//Ce processus obtient le champ personnalisé du ticket existant, le met à jour et le renvoie.
Collection<CustomField> customFieldCollection = setEachCustomField(issue, fetchedIssue);
issue.clearCustomFields();
issue.addCustomFields(customFieldCollection);
aaaa-MM-jj
est une option. Sinon, vous obtiendrez une erreur d'analyse.
Ci-dessus (je l'ajouterai quand je le proposerai.)
Recommended Posts