【发布时间】:2016-10-23 11:34:24
【问题描述】:
我目前正在开发一个通过 Apache Felix 使用 OSGi 框架的 Sling servlet。据我了解,如果您想获取和使用其他服务,您有两种选择:
1.编写一个服务监听器,确保在获取和使用你的服务之前注册你想要的服务。
2.使用Apache Felix的@Reference注解获取服务。
我想做选项 2,因为选项 1 需要很多我不需要编写的代码。
所以,这就是我的做法。只是一个免责声明:以下是我的代码的 sn-ps,并不构成我的整个项目。不要期望能够编译这个或任何东西。我已经包含了我认为相关的部分。
首先,我有我的 sling servlet:
package mypackage;
import /*necessary imports*/
@Component( name = "My Sling Servlet", immediate = false, metatype = true)
@Properties({
@Property(name = "sling.servlet.paths", value = "/bin/mytest"),
@Property(name = "sling.servlet.methods", value = "GET")
})
@Service(Servlet.class)
public class MyServlet extends SlingSafeMethodsServlet {
@Reference
private MyService service;
// Do stuff with service
}
据我了解,@Component 注释让 OSGi 知道这个类文件定义了一个组件。 @Properties 注释定义了组件的一些基本属性(在这种情况下,对我们来说很重要的是,现在我们可以通过转到 [hostname]/bin/mytest 来运行这个 servlet)。 @Service 注释让 OSGi 知道这个类是一个服务(特别是实现了 Servlet 类的服务),并且还注册了这个服务。最后,@Reference 注释告诉 OSGi,我们要声明的字段是这个包中已经注册的 OSGi 服务,我们应该抓住它。
现在,这是另一个相关文件,它定义了服务 MyService:
package mypackage;
import /*necessary imports*/
@Component(name="MyService", immediate=false,metatype=true)
@Service(value = MyServiceInterface.class)
public class MyService implements MyServiceInterface {
// Implementation of MyServiceInterface
}
在这里,我们使用@Component 注释声明了MyService 是一个OSGi 组件。这里的重要说明是我们使用了@Service 注释,它显然完成了一项基本任务:@Service 注释注册服务。
请假设有一个文件 MyServiceInterface.java 看起来像这样:
package mypackage;
import /*necessary imports*/
public interface MyServiceInterface {
//stuff
}
在完成所有这些初步准备之后,这是我的问题。当我通过在 Web 浏览器中访问 [hostname]/bin/mytest 来运行我的 servlet 时,我得到一个 404 page not found 错误。这表明我的浏览器找不到 servlet。
您现在可能会问自己为什么我认为这与@Reference 注释有关。好吧,我认为它在某种程度上是负责任的,因为当我将其注释掉并以老式方式(即上面的方法 1)获取服务时,servlet 运行没有任何问题。
另一个可能相关的信息是我正在使用 Maven 来构建这个项目。如果您认为它们会包含有用的信息,我很乐意提供相关的 pom.xml 文件。
请帮我弄清楚为什么我使用@Reference 注解时找不到我的servlet!如果您需要我在帮助我之前提供更多信息,那么我很乐意这样做。如果我没有提供足够的信息,请在 cmets 中指出。
提前致谢!
【问题讨论】:
-
您是否附加了调试器?您是否实现了#doGet 方法并且正在被访问?
-
是的,我有一个调试器并且我已经覆盖了
doGet方法。当存在@Reference注释时,不会达到doGet方法。但是,当我删除注释时肯定会达到。 -
如果将 immediate 设置为 true 会发生什么?
-
安装包时,日志中是否有任何错误?
标签: java servlets osgi apache-felix sling