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