无法Iteare段落对象

时间:2016-12-19 05:33:49

标签: java jsp cq5 aem sightly

我正在尝试将现有的组件代码从JSP转换为Sightly。为此,我需要在后端获取paragarph对象,即java并将其发送到sightly(HTL)。

JSP中的现有代码:

<%
ParagraphSystem parSys = ParagraphSystem.create(resource, slingRequest);
for (Paragraph par: parSys.paragraphs()) { %>
<sling:include resource="<%= par %>"/><%
} %>

通过这种方式,组件中包含了一个资源。

以下是新的&amp; amp;上面的jave代码:

爪哇:

public class AnchorList extends WCMUsePojo{

private List<Paragraph> paragraphs;

public List<Paragraph> getParagraphs() {
    return paragraphs;
}

public void setParagraphs(List<Paragraph> paragraphs) {
    this.paragraphs = paragraphs;
}

public void activate() throws Exception{

    paragraphs = new LinkedList<Paragraph>();
    Resource resource = getResource();

    SlingHttpServletRequest slingRequest = getRequest();

    ParagraphSystem parSys = ParagraphSystem.create(resource, slingRequest);

    for (Paragraph par: parSys.paragraphs()) {
        paragraphs.add(par);
    }
}

}

悦目:

<div data-sly-use.anchorList="com.xxx.components.AnchorList"data-sly-unwrap>
<div data-sly-list.paras="${anchorList.paragraphList}" data-sly-unwrap>

    <div data-sly-test.paraList="${paras}" data-sly-unwrap></div>
    <div class="anchorlistitem section collapsed">
    <div data-sly-resource="${@ resource=paraList}" data-sly-unwrap></div>
    </div> 
    </div>

我在这里遇到两个问题。首先,我无法使用sightly从java到前端获取段落对象。我试图通过使用以下内容显示段落对象的值来验证它:

<div>
para object is ${paras}
</div>

但它没有任何价值。我能够在java类中看到段落对象值,但是它无法在sightly中读取它。

第二个问题是,我需要JSP的等效代码才能在组件中包含资源。我不确定我使用data-sly-resource编写的代码是否正确。

以下是我在尝试运行上述java / htl代码时遇到的错误日志:

19.12.2016 00:22:51.778 ERROR [0:0:0:0:0:0:0:1 [1482124971543] GET /website/en/home/what-is-totalinsight/investing.html HTTP / 1.1] com.day.cq.wcm.core.impl.WCMDebugFilter例外:org.apache.sling.api.request.RecursionTooDeepException:/ content / websitet / en / home / what-is-totalinsight / investing / jcr:content / page_content / achorlist org.apache.sling.scripting.sightly.SightlyException:org.apache.sling.api.request.RecursionTooDeepException:/ content / website / en / home / what-is-totalinsight / investing / jcr:content / page_content / com.adobe.cq.sightly.WCMScriptHelper.includeResource(WCMScriptHelper.java:143)的com.adobe.cq.sightly.WCMScriptHelper.includeResource(WCMScriptHelper.java:86)com.adobe.cq.sightly.internal上的achorlist。 extensions.ResourceExtension.call(ResourceExtension.java:99)位于apps.pnc_total_insight.components.elements.achorlist的org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl.call(RenderContextImpl.java:89)。 SightlyJava_achorlist.render(SightlyJava_achorl ist.java:116)org.apache.sling.scripting.sightly.impl.engine.runtime.RenderUnit.render(RenderUnit.java:52)at org.apache.sling.scripting.sightly.impl.engine.SightlyScriptEngine。来自org.apache.sling.scripting.core.impl.DefaultSlingScript.call的org.apache.sling.scripting.sightly.impl.engine.SightlyScriptEngine.eval(SightlyScriptEngine.java:83)中的evaluateScript(SightlyScriptEngine.java:95)( DefaultSlingScript.java:361)

2 个答案:

答案 0 :(得分:0)

您无法直接使用资源对象。相反,您可以使用资源路径和资源类型包含资源,如下所示。

$pip --version
pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)

$ python --version
Python 2.7.11+

此外,您可以使用<sly data-sly-use.anchorList="com.xxx.components.AnchorList"> <sly data-sly-list.paras="${anchorList.paragraphList}"> <div class="anchorlistitem section collapsed"> <sly data-sly-resource="${paras.resourcePath @ resourceType=paras.resourceType}"></sly> </sly> </sly> 标记,而不是对每个元素使用<sly>

答案 1 :(得分:0)

您的代码存在以下问题:

  • 您将段落列表的getter定义为AnchorList#getParagrahs,但您可以从HTL / Sightly脚本中将其作为anchorList.paragraphList调用。您应该使用anchorList.paragraphs
  • data-sly-test.paraList="${paras}"件是不必要的。您可以使用迭代器变量paras访问当前项目,无需重新分配它。
  • 要包含段落资源,您应使用路径:data-sly-resource="${paras.path @ resourceType}"。在较新版本的HTL / Sightly中,您可以直接使用实际资源:https://issues.apache.org/jira/browse/SLING-5811

根据您使用的HTL / Sightly的版本,您可能希望将<div data-sly-unwrap...>..替换为<sly..>..