AEM:OSGI吊索服务激活方法未执行

时间:2015-02-12 02:54:27

标签: osgi aem sling

我正在尝试在AEM中创建一个非常基本的吊索服务:

package com.mypackage;

/**
 * A simple service interface
 */
public interface TestService {

    /**
     * @return the name of the underlying JCR repository implementation
     */
    public String getPropertyName();

}

实施类:

package com.mymypackage.impl;

import javax.jcr.Repository;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.jcr.api.SlingRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mypackage.TestService;


@Component(label = "Title", description = "Description.", immediate = true, metatype = true, policy = ConfigurationPolicy.REQUIRE)
@Service(value = {TestService.class})
@Properties({
    @Property(name = "propertyPath", label = "Property Label", description = "Property Desc.")
})
public class TestServiceImpl implements TestService {

    private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class);

    String propertyPath = null;

    @Activate
    public void activate(ComponentContext ctx) {
        Dictionary properties = ctx.getProperties();
        String propertyPath =(String)properties.get("propertyPath");
        log.info("====================getPropertyName activate========================"+propertyPath);
        this.propertyPath = propertyPath;
    }


    @Override
    public String getPropertyName() {
        // TODO Auto-generated method stub
        log.info("====================getPropertyName========================"+propertyPath);
        return propertyPath;
    }
}

我在config文件夹中创建了一个sling类型的节点:OsgiConfig。该节点的名称是com.mypackage.impl.TestServiceImpl.xml,它是它的内容:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="sling:OsgiConfig"
    propertyPath="http://www.myuhc.com"/>

这就是我尝试在Java类中使用它的方式:

public static String getTestService() {
        TestService testService = new TestServiceImpl();
        String prop = testService.getPropertyName();
        return prop;
}

使用customtaglib从JSP调用此方法(通过.tld文件映射方法)

当我使用这种方法时,不调用HelloServiceImpl类中的activate方法,因此未设置该属性。但是当我在组件JSP中使用这样的服务时:

<%@page import="org.osgi.service.cm.ConfigurationAdmin"%>
<%@page import="org.osgi.service.cm.Configuration"%>

<%
Configuration conf = sling.getService(org.osgi.service.cm.ConfigurationAdmin.class).getConfiguration("Name of the config");
String myProp = (String) conf.getProperties().get("property key");
%>
一切正常。尝试从Java类调用服务时,我必须要做的事情确实有问题。我该如何使用这种方法。我不想在JSP中使用scriptlet。此外,任何最佳实践都将受到高度赞赏。

提前致谢

3 个答案:

答案 0 :(得分:2)

OSGi服务在一个生命周期内工作,该生命周期管理服务实例的创建和删除。

作为这些实例的容器管理的一部分,当容器创建实例时,它会使用适当的值调用激活方法。这样就可以分配财产。

您在第一个代码段中执行的操作:

TestService testService = new TestServiceImpl();
String prop = testService.getPropertyName();

未使用组件的容器版本。您使用直接实施并绕过容器管理。

使用容器管理的实例。您需要从容器中请求它。

这正是您的第二个代码段显示的内容

sling.getService(org.osgi.service.cm.ConfigurationAdmin.class)

从容器中请求最佳匹配服务。

从容器访问服务。您需要自己成为服务。您可以通过@Reference注释来执行此操作。

你提到但是在taglib中会让事情变得复杂一些。你需要获得对SlingScriptHelper的引用,它可以从pageContext中获取,如下所示;

    ServletRequest request = pageContext.getRequest();
    final SlingBindings bindings = (SlingBindings) request
            .getAttribute(SlingBindings.class.getName());
    final SlingScriptHelper scriptHelper = bindings.getSling();
    TestService service= scriptHelper
            .getService(com.mymypackage.impl.TestService.class);

答案 1 :(得分:0)

问题是,有时当您尝试重新安装捆绑包时,某些旧的已编译的classess不会被删除并替换为新的。尝试删除/var/classes和/或/var/clientlibs节点并重新安装项目。

答案 2 :(得分:0)

如果您无法使用@Reference批注来注入服务

,这也可能很有用
is.na(dm2) <- !is.na(dm)