#java #sonarqube
Вопрос:
Я новичок в программировании на Java. Ниже приведен код
public class AddJIRATicketWatcherCommandHandler {
private final JiraFactory jiraFactory;
public void handle(String jiraIssueKey, String watcher) {
log.debug("Adding {} watcher to JIRA issue: {}", watcher, jiraIssueKey);
final Issue issue = jiraFactory.createClient().getIssueClient().getIssue(jiraIssueKey).claim();
log.debug("Found JIRA issue: {}", issue.getKey());
Promise<Void> addWatcherPromise = jiraFactory.createClient().getIssueClient().addWatcher(issue.getWatchers().getSelf() , watcher);
addWatcherPromise.claim();
}}
public JiraRestClient createClient() {
log.debug("Creating JIRA rest client for remote environment");
URI jiraServerUri = URI.create("");
jiraServerUri = new URI(StringUtils.removeEnd(jiraConfig.getJiraURI(), "/rest"));
JiraRestClient restClient = new AsynchronousJiraRestClientFactory().createWithBasicHttpAuthentication(jiraServerUri,
jiraConfig.getJiraUsername(),
jiraConfig.getJiraPassword());
JIRA_LOGGER.info("url=[{}], username=[{}], password=[{}]", jiraServerUri.toString(), jiraConfig.getJiraUsername(), jiraConfig.getJiraPassword());
log.debug("JIRA rest client created successfully for remote environment");
return restClient;
}
Однако, когда я запустил сонаркубе. Я получил эту ошибку.
Используйте try-with-resources или закройте этот «JiraRestClient» в предложении «finally».
Я понимаю, что нужно закрыть соединение, как только это будет сделано. Но я не уверен, как это сделать.
Я попытался реализовать, наконец, с помощью close(). Но результаты по-прежнему показывают ту же ошибку.
Комментарии:
1. поместите JiraRestClient в переменную и вызовите
close()
метод для нее в блоке finally. Или попробуйте использовать ресурсы2. Я пробовал, попробуйте{ } наконец { RestClient.close(); } , но это не работает
Ответ №1:
Попробуйте с ресурсами:
public void handle(String jiraIssueKey, String watcher) {
try (JiraRestClient restClient = jiraFactory.createClient()) {
log.debug("Adding {} watcher to JIRA issue: {}", watcher, jiraIssueKey);
final Issue issue = restClient.getIssue(jiraIssueKey).claim();
log.debug("Found JIRA issue: {}", issue.getKey());
Promise<Void> addWatcherPromise = restClient.getIssueClient().addWatcher(issue.getWatchers().getSelf() , watcher);
addWatcherPromise.claim();
}
}
попробуй наконец:
public void handle(String jiraIssueKey, String watcher) {
JiraRestClient restClient = jiraFactory.createClient();
try {
log.debug("Adding {} watcher to JIRA issue: {}", watcher, jiraIssueKey);
final Issue issue = restClient.getIssue(jiraIssueKey).claim();
log.debug("Found JIRA issue: {}", issue.getKey());
Promise<Void> addWatcherPromise = restClient.getIssueClient().addWatcher(issue.getWatchers().getSelf() , watcher);
addWatcherPromise.claim();
} finally {
restClient.close();
}
}
Комментарии:
1. Привет, Уиллем, спасибо за предложение. Я попытался использовать этот код и запустить его в sonarqube. Однако результат ошибки все равно остается тем же
2. Хм, вам следует заменить другие ваши вызовы на
jiraFactory.createClient()
переменную RestClient. Так что вы только один раз создадите соединение и закроете его. Но тогда все равно похоже, что сонар жалуетсяrestClient
на то, что вы добавили и закрыли… Я не уверен, что в этом плохого, может быть, это исчезнет, если вы измените другие вызовы наjiraFactory.createClient()
? Или сонар сообщает что-то полезное, когда вы нажимаете «почему это проблема»3. Привет, Виллем, после этого я попробовал первый подход (попробуйте с ресурсами), и, по-видимому, он работает отлично. Спасибо!