Avertissement ResourceResolver non fermé à l’adresse com.day.cq.search.impl.builder.QueryBuilderImpl
Découvrez comment résoudre l’avertissement ResourceResolver non fermé sur com.day.cq.search.impl.builder.QueryBuilderImpl.
Description description
Environnement
AEM 6.5
Problème/Symptômes
Un avertissement de session non fermée apparaît dans les journaux provenant de la classe QueryBuilderImpl : 11.01.2018 01:03:18.878 *INFO* [ Apache Sling Resource Resolver Finalizer Thread]
11.01.2018 01:03:18.878 *INFO* [ Thread de finalisation du résolveur de ressource Apache Sling] org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl Unclosed ResourceResolver a été créé ici :
java.lang.Exception: Opening Stacktrace
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl$ResolverReference.< init> (CommonResourceResolverFactoryImpl.java:521)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.register(CommonResourceResolverFactoryImpl.java:218)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.< init> (ResourceResolverImpl.java:101)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.< init> (ResourceResolverImpl.java:94)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal(CommonResourceResolverFactoryImpl.java:263)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolver(CommonResourceResolverFactoryImpl.java:173)
at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getResourceResolver(ResourceResolverFactoryImpl.java:105)
at com.day.cq.search.impl.builder.QueryBuilderImpl.createResourceResolver(QueryBuilderImpl.java:210)
at com.day.cq.search.impl.builder.QueryImpl.getResourceResolver(QueryImpl.java:231at com.day.cq.search.impl.result.HitImpl.getResource(HitImpl.java
):108at com.day.cq.search.writer.SimpleHitWriter.writeSimpleJson(SimpleHitWriter.java
):54at com.day.cq.search.writer.SimpleHitWriter.write(SimpleHitWriter.java
at com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.writeHits(QueryBuilderJsonServlet.java:41 com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.handleQuery(QueryBuilderJsonServlet.java
):165at com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.doGet(QueryBuilderJsonServlet.java
at org.apache.sling.api.servlets.SlingSafeMethodsServlet.mayService(SlingSafeMethodsServlet.java:113at org.apache.sling.api.servlets.SlingAllMethodsServlet.mayService(SlingAllMethodsServlet.java
):73at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java
at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:270at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java
):140at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java
):346
:378
:552
:44
Résolution resolution
Sur les sites AEM actifs, il est recommandé que les URL /bin/querybuilder soient bloquées par le Dispatcher.
Ces URL peuvent être utilisées en toute sécurité sur les instances d’auteur (orientées réseau interne), mais sur les sites en ligne, cela peut ouvrir le système à la divulgation des données.
La solution à ce bogue consiste à éviter d’utiliser le servlet /bin/querybuilder et à utiliser à la place l’API QueryBuilder.
Après avoir appelé l’API , fermez manuellement le ResourceResolver après avoir traité le résultat de la requête.
Retrouvez l’exemple de code ici. Par exemple, voici des résolveurs de ressources avec fuite de code :
Requête = queryBuilder.createQuery(…, session);
Résultat SearchResult = query.getResult();
for (Accès : result.getHits()) {
// do certains traitements
}
Code de solution :
solution
// : fermez le résolveur de ressources interne
Itérateur< Ressource> ressources = result.getResources();
if (resources.hasNext()) {
resources.next().getResourceResolver().close();
}