【问题标题】:How do I implement properly a servlet using OSGi declarative services?如何使用 OSGi 声明式服务正确实现 servlet?
【发布时间】:2019-09-25 07:54:59
【问题描述】:

我正在尝试(学习如何)使用 OSGi 提供的声明式服务 (DS) 创建一个 Servlet (javax.servlet.Servlet),如下所示:

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.service.component.annotations.Component;

@Component(service = Servlet.class, property = { "alias:String=/hello" }, immediate = true)
public class LogsHTTPServlet extends HttpServlet {

    private static final long serialVersionUID = 2302372200114479484L;

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            resp.setContentType("text/plain");
            resp.getWriter().println("It works!");
        } catch (Exception e) {
            e.printStackTrace();
        }
        resp.setStatus(200);
    }
}

当我在 Eclipse 上运行 the project (2019-03 (4.11.0),build id: 20190314-1200)this target platform 上运行时,使用 custom run configuration,其中我使用this VM argument (-Dorg.osgi.service.http.port=8080) 设置org.eclipse.jetty.server(和其他必需的依赖项),我在 osgi 控制台中看到如下内容:

osgi> 2019-05-07 18:22:28.236:INFO::Start Level: Equinox Container: 0d7d3d67-401b-48eb-b016-6e6c0c16352c: Logging initialized @1590ms to org.eclipse.jetty.util.log.StdErrLog
2019-05-07 18:22:28.388:INFO:oejs.session:Start Level: Equinox Container: 0d7d3d67-401b-48eb-b016-6e6c0c16352c: DefaultSessionIdManager workerName=node0
2019-05-07 18:22:28.388:INFO:oejs.session:Start Level: Equinox Container: 0d7d3d67-401b-48eb-b016-6e6c0c16352c: No SessionScavenger set, using defaults
2019-05-07 18:22:28.389:INFO:oejs.session:Start Level: Equinox Container: 0d7d3d67-401b-48eb-b016-6e6c0c16352c: node0 Scavenging every 660000ms
2019-05-07 18:22:28.427:INFO:oejs.session:Start Level: Equinox Container: 0d7d3d67-401b-48eb-b016-6e6c0c16352c: node0 Scavenging every 660000ms

现在,当我使用 Postman (http://127.0.0.1:8080/hello) 执行此请求时,我得到:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <title>Error 404 ProxyServlet: /hello</title>
    </head>
    <body>
        <h2>HTTP ERROR 404</h2>
        <p>Problem accessing /hello. Reason:

            <pre>    ProxyServlet: /hello</pre>
        </p>
        <hr>
        <a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.15.v20190215</a>
        <hr/>
    </body>
</html>

我该如何解决这个问题?

【问题讨论】:

    标签: java eclipse servlets osgi declarative-services


    【解决方案1】:

    使用 osgi.http.whiteboard.servlet.pattern 属性代替 alias

    @Component(service = Servlet.class, property = {"osgi.http.whiteboard.servlet.pattern=/hello/*" })
    

    或者,使用当前的 osgi 纲要依赖项(版本 7.0.0),您可以像这样使用 @org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern 注释:

    @Component(service=Servlet.class)
    @org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern("/hello/*")
    

    https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#service.http.whiteboard-i21223311

    【讨论】:

    猜你喜欢
    • 2021-06-13
    • 2012-08-05
    • 2011-12-02
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多