0

我将 OSGi 的 Felix 实现与 Maven 一起使用。我使用 maven bundle 插件来连接依赖项(即 Service-Component 标头)。我使用以下内容注册一个servlet

<Service-Component>
 com.mycompany.MyServlet;
 provide:=javax.servlet.http.HttpServlet;immediate:=true;
 http=org.osgi.service.http.HttpService
</Service-Component>

但是,我想使用相同的 HTTP 服务运行第二个 servlet。我怎样才能做到这一点?

4

2 回答 2

2

我建议将 felic SCR 注释与 maven-scr-plugin 一起使用

然后你可以简单地注释你的 servets:

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path1")
public class Servlet1 extends HttpServlet {
    ...
}

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path2")
public class Servlet2 extends HttpServlet {
    ...
}

它还假设您安装了 Felix HTTP 白板包。HTTP 白板将检测所有 javax.servlet.Servlet 类型的服务,并自动将它们注册到 HTTP 服务。

于 2013-06-19T16:21:09.980 回答
1

快速回答:简单,在 Service-Component 标头中添加更多子句:

 <Service-Component>
  com.mycompany.MyServlet1;
    provide:=javax.servlet.http.HttpServlet;immediate:=true;
    http=org.osgi.service.http.HttpService,
  com.mycompany.MyServlet2;
    provide:=javax.servlet.http.HttpServlet;immediate:=true;
    http=org.osgi.service.http.HttpService
 </Service-Component>

更好的答案。Apache Felix 有 White board bundle。此捆绑包在服务注册表中跟踪 Servlet 服务(不是 HttpServlet!但它确实跟踪过滤器服务),并自动将它们添加到当前的 Http 服务服务中。所以你所做的就是在 Servlet.class 下注册一个别名的“别名”属性。这也不需要您立即执行,使其在使用 servlet 之前变得懒惰。这在 42 的回答中得到了提倡,但使用标题方法看起来像这样:

 <Service-Component>
  com.mycompany.MyServlet1;
    provide:=javax.servlet.servlet.Servlet; 
    properties="alias=/path"
 </Service-Component>

最佳答案,使用 OSGi DS 注释来注册您的 servlet:

 @Component(provide=Servlet.class, properties='alias=/path')
 public void MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest rq, HttpServletResponse rsp) {
        ...
    }
 }
于 2013-06-24T07:29:14.083 回答