Adobe CQ:通过@Reference注入服务返回null

时间:2014-04-02 09:39:25

标签: service reference dependency-injection adobe cq5

我试图通过Adobe CQ5中的@Reference注释将服务注入组件,但在部署之后它总是向我返回null而不是服务实例。

@Component(immediate = true)
@Service(value = GoodbyeWorldService.class)  
public class GoodbyeWorldService {
    @Reference
    protected Scheduler scheduler;
    private final static Logger LOGGER = LoggerFactory.getLogger(GoodbyeWorldService.class);

    public void get() {
       LOGGER.info("Scheduler is " + this.scheduler);
   } 
}

JSP:

<%@ include file="/apps/cqblueprints-example/components/global.jspx" %>    
<jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>    
<jsp:useBean id="goodbye" class="com.cqblueprints.example.services.GoodbyeWorldService" scope="page" />      
<% goodbye.get(); %>    

在日志中我得到:

2014-04-02 12:24:09.999 INFO [com.cqblueprints.example.services.GoodbyeWorldService] Scheduler is null

我已经测试了这个bean的其他简单打印方法。他们的工作就像魅力一样。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

为了让OSGi注入@Reference字段,您不能将服务视为Java bean。使用SlingScriptHelper作为JSP文件中的sling对象以正确的方式获取服务:

<% GoodbyeWorldService service = sling.getService(GoodbyeWorldService.class); %>
<%= service.get() %>

完整示例:

<%@page session="false" import="your.package.GoodbyeWorldService"
%><%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"
%><sling:defineObjects/><%
    GoodbyeWorldService service = sling.getService(GoodbyeWorldService.class);
%><%= service.get() %>

答案 1 :(得分:0)

问题解决了!我刚刚将maven-scr-plugin的版本从1.7.4更新到1.9.0,它开始工作了!现在我通过@Reference注释检索我的实例,我在&#34;服务&#34;中看到了我的服务。和&#34;组件&#34; Felix OSGi控制台中的选项卡。感谢所有在这里回复的人!