Aem 在CQ5.6中获取bean中的slingRequest

Aem 在CQ5.6中获取bean中的slingRequest,aem,jcr,sling,Aem,Jcr,Sling,包括jsp顶部的libs/foundation/global.jsp,最终调用,从而实例化可以在Scriptlet中使用的slingRequest或currentNode变量。然而,我正在创建bean,并像这样包含它们 <jsp:useBean id="myBean" class="com.foo.bar.MyBean" /> <jsp:setProperty name="myBean" property="request" value="<%= slingRequest

包括jsp顶部的
libs/foundation/global.jsp
,最终调用
,从而实例化可以在Scriptlet中使用的slingRequest或currentNode变量。然而,我正在创建bean,并像这样包含它们

<jsp:useBean id="myBean" class="com.foo.bar.MyBean" />
<jsp:setProperty name="myBean" property="request" value="<%= slingRequest %>" />
在这里,我实例化bean并传递对当前请求的引用


我的问题是,如何避免必须传入此参数?有没有办法通过某种静态上下文获取对当前请求的引用,以便我可以在构造函数中设置bean属性?

没有办法静态地将请求传递给新创建的bean(也没有办法,因为可能同时有多个请求,所以我们不能使用共享的静态变量来存储它)。您可以创建scriptlet:

<% pageContext.setAttribute("myBean", new MyBean(slingRequest)); %>

MyBean property: ${myBean.property}

MyBean属性:${MyBean.property}
或者去掉bean,使用Thomas提到的框架之一:

  • ,
  • ,

永远不要将请求对象传递给Bean类。我同意托马斯和托梅克的回答

<>但是开始在一个项目中突然使用一个框架来解决这个问题是一个多余的问题。p> 这里的基本思想是不应该传递请求对象。相反,您应该从请求中获取资源URI,并将其传递给Bean类

此外,您可以传递ResourceResolver对象以获取Bean类中的任何资源

我的示例代码如下所示:

    <jsp:useBean id="myBean" class="com.foo.bar.MyBean" />
    <jsp:setProperty name="myBean" property="resourcePath" value="<%= slingRequest.getResourceURI() %>" />
    <jsp:setProperty name="myBean" property="resourceResolver" value="<%= slingRequest.getResourceResolver() %>" />
public SlingHttpServletRequest getResourcePath() {
    return resourcePath;
}

public void setResourceResolver(String resourcePath) {
    this.resourcePath = resourcePath;
}

public SlingHttpServletRequest getResourceResolver() {
    return resolver;
}

public void setResourceResolver(ResourceResolver resovler) {
    this.resolver = resolver;
}
现在在bean类中,您可以使用resourcePath和ResourceResolver形成资源对象,如下所示:

Resource resource = resourceResolver.resolve(resourcePath);

如果只使用jsp:useBean,我不确定您是否可以访问PageContext,从它可以访问bean中的所有实例。我们有我们的bean的自定义标记,我们在其中注入请求之类的属性。你也可以考虑使用一个可用的框架:SLIN模型、切片、内巴…谢谢,这很好。最初尝试包括Sling模型和Slice with maven bundle插件都不起作用,但我会继续尝试。
Resource resource = resourceResolver.resolve(resourcePath);