2

我从 ResourceResolverFactory 得到一个 ResourceResolver 对象,即我正在创建这个 resourceResolver 并且我正在适应 Session。

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

我是否需要同时关闭解析器和会话,或者关闭一个就足够了?

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

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

这个问题是关于“我们应该关闭两者”而不是先关闭哪个

4

2 回答 2

9

当您调用该方法时,ResourceResolver将关闭底层证券。SessionResourceResolver.close()

如果您使用较新版本的 Sling,我建议您在使用try-with-resource时使用该构造ResourceResolver

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

由于ResourceResolver实现了AutoClosable接口,它可以与try-with-resource. 这将始终关闭ResourceResolver,您将不必处理异常等。

请注意,您只能使用ResourceResolver您创建的 s 来执行此操作。例如,如果您使用ResourceResolver从 a 获得的Resource,则不应关闭它。最好的做法是只有创建它的人ResourceResolver才能关闭它。

于 2017-08-16T20:46:38.603 回答
2

关闭一个将关闭它们两个。如果您记录消息或调试,您将看到您没有输入第二个 if 语句。

于 2017-08-16T18:39:41.777 回答