我试图通过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的其他简单打印方法。他们的工作就像魅力一样。
我错过了什么?
答案 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控制台中的选项卡。感谢所有在这里回复的人!