Произошла исключительная ситуация com.sun.jdi. InvocationException, вызвав метод osgi aem read subservice. - PullRequest
0 голосов
/ 07 сентября 2018

Я получаю исключение nullpointer в журналах ошибок, когда использую подсервис для чтения деталей шаблона в AEM 6.4

map.get дает исключение нулевого указателя

с сообщением об ошибке

com.adobe.cq.sightly.WCMUsePojo Не удалось активировать класс Use java.lang.IllegalArgumentException: javax.jcr.RepositoryException: Эта сессия была закрыта. в org.apache.sling.jcr.resource.internal.JcrValueMap.readFully (JcrValueMap.java:395) [org.apache.sling.jcr.resource: 3.0.8] в org.apache.sling.jcr.resource.internal.JcrValueMap.entrySet (JcrValueMap.java:183) [org.apache.sling.jcr.resource: 3.0.8] в com.mysite.core.helpers.AnalyticsHelper.activate (AnalyticsHelper.java:138) [mysite-core: 1.0.0.SNAPSHOT] в com.adobe.cq.sightly.WCMUsePojo.init (WCMUsePojo.java:86) [Com.adobe.cq.sightly.cq-WCM-красивый-расширение: 1.5.12]

в AEM 6.3 работает нормально, но в AEM 6.4 выдает исключение нулевого указателя

карта нулевая. Работает нормально, когда убираю закрытие Resresolver

MysiteReadTemplateService mysiteReadTemplateService = getSlingScriptHelper()
                .getService(MysiteReadTemplateService .class);
        ValueMap map = mysiteReadTemplateService 
                .fetchTemplateDetails(templatePath);
        if (map != null) {
            templateName = map.get("jcr:title", "");
            templateDescription = map.get("jcr:description", "");
        }

внутри метода fetchTemplateDetails -

Map<String,Object> paramMap = new HashMap<String,Object>();
          //Mention the subServiceName that is configured in the User Mapping
          paramMap.put(ResourceResolverFactory.SUBSERVICE, "mysitereadservice");
          log.info("After the param");
          ResourceResolver rr = null;
          ValueMap map =null;
          try{
                rr = resourceFactory.getServiceResourceResolver(paramMap);
                log.info("UserId : " + rr.getUserID());
                Resource templateResource = rr.getResource(templatePath);
                log.info("Resource : " + templateResource.getPath());
                map = templateResource.getValueMap();  
                rr.close();
          }catch(Exception e){
                log.error(e.getMessage());
          }
          return map;

при комментировании rr.close в классе analyticshelper map не является нулевым.

возможные объяснения приведены в

com.sun.jdi.InvocationException произошел вызов метода

но, тем не менее, мы хотим закрыть средство поиска ресурсов, так как его закрытие приведет к множеству незакрытых сеансов.

Если кто-то сталкивался с той же проблемой, не могли бы вы сообщить нам свои мысли или как я могу реорганизовать код, чтобы мы могли закрыть распознаватель ресурсов, так как карта не является нулевой.

1 Ответ

0 голосов
/ 10 сентября 2018

Вы не можете получить доступ к ресурсам или свойствам (ValueMap) после закрытия sesssion / resourceResolver. Поместите ваши данные в другую структуру данных (Коллекция, Карта) и верните ее. Или выполните свои действия, когда сессия открыта:

Map<String, Object> result = new HashMap<String, Object>;
ResourceResolver rr = null;

try{
    Map<String,Object> paramMap = new HashMap<String,Object>();
    //Mention the subServiceName that is configured in the User Mapping
    paramMap.put(ResourceResolverFactory.SUBSERVICE, "mysitereadservice");
    log.info("After the param");
    rr = resourceFactory.getServiceResourceResolver(paramMap);

    if (rr != null) {
        log.info("UserId : " + rr.getUserID());

        Resource templateResource = rr.getResource(templatePath);

        if (templateResource != null) {
            log.info("Resource : " + templateResource.getPath());
            ValueMap map = templateResource.getValueMap();  

            result.put("jcr:title", map.get("jcr:title",""))
            result.put(......);
            result.put(......);
            result.put(......);
            result.put(......);
            result.put(......);
        }
    }
}catch(LoginException e){
    log.error(e.getMessage(), e);
} finally {
    if (rr != null && !rr.isLive()) {
        rr.close();
    }
}

return result;

ResourceResulver должен быть закрыт в блоке finally или использовать try-with-resources:

try (ResourceResolver rr = resourceFactory.getServiceResourceResolver(paramMap)) {
    //yourCode
} catch (LoginException e) {
    log.errror(e.getMessage(), e);
}
...