Нужно ли закрывать Resolver Resolver и Session?

Я получаю ResourceResolver Object от ResourceResolverFactory, т.е. я создаю этот resourceResolver, и я адаптируюсь к Session.

Session session = resourceResolver.adaptTo(Session.class);

Нужно ли закрыть оба, резольвера и сеанса или закрытия будет достаточно?

finally {
    if (session != null && session.isLive()) {
        session.logout();
    }

    if (resourceResolver != null && resourceResolver.isLive()) {
        resourceResolver.close();
    }
}

Этот вопрос о том, "должны ли мы закрывать оба", а не о том, что закрыть первым

2 ответа

Решение

ResourceResolver закроет базовый Session когда вы звоните ResourceResolver.close() метод.

Если вы используете более новые версии Sling, я бы посоветовал вам использовать try-with-resource построить, когда вы используете ResourceResolver:

try (final ResourceResolver resolver = this.getResourceResolver()) {
    [... use resolver here ...]
}

поскольку ResourceResolver реализует AutoClosable интерфейс может быть использован с try-with-resource, Это всегда закроет ResourceResolver и вам не придется иметь дело с исключениями и т. д.

Остерегайтесь, что вы можете сделать это только с ResourceResolverс, что вы создали. Если вы используете ResourceResolver что вы получаете от Resource например, вы не должны закрывать его. Лучшей практикой считается, что только тот, кто создал ResourceResolver должен закрыть это.

Закрытие одного закроет их обоих. Если вы зарегистрируете сообщение или отладите сообщение, вы увидите, что не вводите второй оператор if.

Другие вопросы по тегам