AEM CQ5将SlingHttpServletRequest对象传递给服务

时间:2017-02-07 19:59:54

标签: osgi cq5 aem

我正在尝试将SlingRequest对象从组件jsp传递到osgi服务,如下所示。但该服务尚未注册。 (不知道为什么?)

# This is 2 GB. Pick an appropriate value for your app. 
java -Xms2g -Xmx2g -jar my.jar

问题:是否允许将SlingRequest对象从组件jsp传递给osgi服务?如果允许,为什么我的服务没有注册。如果我取出SlingRequest对象,该服务正在注册,我可以从jsp调用该服务。

1 个答案:

答案 0 :(得分:0)

包括您的OOTB /libs/foundation/global.jsp使您获得默认标签libs,吊索对象和定义的CQ对象。

当您将服务的完全限定名称传递给sling.getService方法时,SlingRepository将被OSGi包管理组件注入服务。

在您的代码段sling.getService(InverterFactory.class)中,从 sling SlingScriptHelper对象获取服务,以检索Sling中可用的OSGi服务,这通常会在界面上调用。使用sling.getService创建Service对象后,可以调用该服务公开的任何方法。

查看ScriptHelper api文档和sling scripting variables

尝试下面的代码段

<% your.qualified.path.InverterFactory Invfac = sling.getService(your.qualified.path.InverterFactory.class); %> <c:set var="inverterData" value='<%=Invfac.getOverview(slingRequest, resourceResolver)%>' scope="request" />

我也不认为SlingRequest对象应该导致任何问题,我已经尝试了你的代码片段语法,只是从OSGI服务返回了一些字符串,它工作正常。以下是我的例子

HelloService接口

public interface HelloService { public String getRepositoryName(); public String getRepositoryName(SlingHttpServletRequest slingRequest, ResourceResolver resourceResolver); }

<强> HelloServiceImpl

@Service
@Component(metatype = false)
public class HelloServiceImpl implements HelloService {
 protected final Logger log = LoggerFactory.getLogger(this.getClass());    
    @Reference
    private SlingRepository repository;
    public String getRepositoryName() {
        return repository.getDescriptor(Repository.REP_NAME_DESC);
    }   
    public String getRepositoryName(SlingHttpServletRequest slingRequest, ResourceResolver resourceResolver) {
    log.info("*** Inside my interface impl OSGI ***");
    String returnstr = repository.getDescriptor(Repository.REP_NAME_DESC)+" Data from OSGI";
       //return repository.getDescriptor(Repository.REP_NAME_DESC);
       return returnstr;
    }
}

<强> OSGICalling.jsp

<%@ page import="com.mycompany.myrestservice.HelloService" %>
<%
com.mycompany.myrestservice.HelloService hs = sling.getService(com.mycompany.myrestservice.HelloService.class);
String repo = hs.getRepositoryName() ; 
out.println("myrepo::" + repo);
%>   
<c:set var="inverteraa" value='<%=sling.getService(com.mycompany.myrestservice.HelloService.class).getRepositoryName(slingRequest,resourceResolver)%>' />
<c:out value="${inverteraa}"/>

<强>输出

outputosgicall