如何使用 OSGi 声明式服务正确实现 servlet?
How do I implement properly a servlet using OSGi declarative services?
我正在尝试(学习如何)使用 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);
}
}
当我 运行 the project on Eclipse (2019-03 (4.11.0), build id: 20190314-1200) upon this target platform, using a custom run configuration, where I set up org.eclipse.jetty.server
(and other required dependencies) with this VM argument (-Dorg.osgi.service.http.port=8080
) 时,我在 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>
如何解决这个问题?
而不是 alias
使用 osgi.http.whiteboard.servlet.pattern
属性:
@Component(service = Servlet.class, property = {"osgi.http.whiteboard.servlet.pattern=/hello/*" })
或者,对于当前的 osgi compendium 依赖项(版本 7.0.0),您可以像这样使用 @org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern
注释:
@Component(service=Servlet.class)
@org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern("/hello/*")
我正在尝试(学习如何)使用 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);
}
}
当我 运行 the project on Eclipse (2019-03 (4.11.0), build id: 20190314-1200) upon this target platform, using a custom run configuration, where I set up org.eclipse.jetty.server
(and other required dependencies) with this VM argument (-Dorg.osgi.service.http.port=8080
) 时,我在 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>
如何解决这个问题?
而不是 alias
使用 osgi.http.whiteboard.servlet.pattern
属性:
@Component(service = Servlet.class, property = {"osgi.http.whiteboard.servlet.pattern=/hello/*" })
或者,对于当前的 osgi compendium 依赖项(版本 7.0.0),您可以像这样使用 @org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern
注释:
@Component(service=Servlet.class)
@org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern("/hello/*")