我正在尝试在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。此外,任何最佳实践都将受到高度赞赏。
提前致谢
答案 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)