【问题标题】:Display all available tags in aem显示 aem 中所有可用的标签
【发布时间】:2017-06-05 10:09:34
【问题描述】:

我正在尝试制作一个在 crx 中打印所有可用标签的组件,但我得到一个空指针异常。我创建了如下界面

package com.aem.community.core.services;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public interface ListTags {
	Map listAllTags(); 
}
和实施

package com.aem.community.core.services.Impl;

import java.util.Iterator;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aem.community.core.services.ListTags;
import com.aem.community.core.services.SearchService;
import com.day.cq.tagging.Tag;
import java.util.HashMap;
import java.util.Map;

@Component
@Service  
public class ListTagsImpl implements ListTags {
  protected final Logger log = LoggerFactory.getLogger(this.getClass());
  
  private Session session;
  
  @Reference
  private ResourceResolver resourceResolver;
  
  @Override
  public Map listAllTags() {
    try { 
      Map<String, String> myHashMap = null;
      Resource tagResource = resourceResolver.getResource("/etc/tags");

      if (tagResource!= null) {
        Iterable<Resource> children = tagResource.getChildren();
        Iterator<Resource> itr = children.iterator();
        while (itr.hasNext()) {
          Resource item = itr.next();
          Tag tag = item.adaptTo(Tag.class);
          if (tag != null) {          	
            Iterator<Tag> childitr = tag.listAllSubTags();
            while (childitr.hasNext()) {
              Tag childitem = childitr.next();
              myHashMap.put((String)tag.getName, ((String)childitem.getName());
            }
          }
        }
      }   
      session.logout();  
      return myHashMap;
    }
    catch(Exception e) {
      log.info(e.getMessage());
    }
    return null;
  }
}

而crx中的代码如下

<%@include file="/libs/foundation/global.jsp"%>
<%@page import="java.util.*, com.day.cq.tagging.* " %>
<%@page import="com.aem.community.core.services.*" %>
<%@page import="com.aem.community.core.services.Impl.*" %>
<% 
try {    
  com.aem.community.core.services.ListTags taglist = sling.getService(com.aem.community.core.services.ListTags.class);

  Map tagnames = taglist.listAllTags(); 
  out.print(tagnames);
} catch(Exception e) {
  out.print(e);
}
%>
但是我无法将服务在地图中返回的值获取到组件的 jsp 中。我得到一个 java.lang.NullPointerException

【问题讨论】:

  • 您这样做是为了学习 API 还是为了满足一些业务需求?如果是后者,则可能有更好的方法来获取标签列表。坦率地说,我根本不知道你为什么要这样做。
  • 另外:您介意分享 NullPointerException 的堆栈跟踪吗?
  • 几点建议:1) 使用 TagManager API 2) 避免使用 JSP 脚本。更多信息:docs.adobe.com/docs/en/aem/6-2/develop/ref/javadoc/com/day/cq/…

标签: java jsp tags aem


【解决方案1】:

这是因为您试图将 ResourceResolver 注入 OSGI 服务。你不能这样做:

@Reference
private ResourceResolver resourceResolver;

可能在您使用资源解析器的地方抛出 NullPointerException。在 OSGI 服务中有几种获取资源解析器的方法,但您可以参考 http://www.one-inside.com/aem6-1-resourceresolver-access-in-services/http://scrupulo.com/posts/blog/view/5-tips-on-the-sling-resource-resolver

【讨论】:

    【解决方案2】:

    这个答案可以帮助其他正在寻找有效遍历资源树而不是编写多个循环并调试它们的人。 Sling API 提供抽象实现,称为 AbstractResourceVisitor.html (AbstractResourceVisitor) 并且 ACS commons 提供了一个示例实现。Sample Implementation

    TLDR :实现一个扩展 AbstractResourceVisitor 的具体类 用需要执行的操作覆盖访问方法。如果在继续遍历时需要考虑自定义条件,您也可以覆盖接受方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多