- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在我的 OSGI 项目中为我的 servlet 使用声明性服务功能。详细信息:用户可以在主应用程序上手动安装模块,选择一些 *.jar 文件,主应用程序嵌入了 OSGI 服务器,当 OSGI 模块被激活时,它应该针对某些请求进行注册例如这样:
protected void startup() {
MyServlet servlet = new MyServlet();
if (httpService != null) {
httpService.registerServlet("/req", servlet, null, null); **//OK!**
}
}
不幸的是,我无法初始化 httpService 实例,这就是问题所在。以下是有问题的 servlet 模块代码 list :
@Component(name="app", immediate=true)
@Service(value=App.class)
public class App {
@Reference(name = "httpService", referenceInterface = HttpService.class, bind = "bindHttpService", unbind = "unbindHttpService")
private HttpService httpService;
@Activate
protected void startup() {
MyServlet servlet = new MyServlet();
if (httpService != null) {
httpService.registerServlet("/req", servlet, null, null);
//OK!
} else {
//Not OK!
}
}
protected void bindHttpService(HttpService httpService) {
this.httpService = httpService;
}
protected void unbindHttpService(HttpService httpService) {
this.httpService = null;
}
// some more code.........
}
Maven捆绑插件设置pom.xml代码
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>app</Bundle-SymbolicName>
<Embed-Dependency>!org.osgi.core</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Import-Package>
<![CDATA[
org.osgi*,
com.mynamespace
]]>
</Import-Package>
</instructions>
</configuration>
</plugin>
这里是主应用程序上嵌入式 OSGI 服务器的简化代码:
public static void main(String[] args)
{
FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
Map<String, String> config = new HashMap<String, String>();
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit");
config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "javax.microedition.io");
Framework framework = frameworkFactory.newFramework(config);
framework.start();
BundleContext context = framework.getBundleContext();
List<Bundle> installedBundles = new LinkedList<Bundle>();
// install prerequisites
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.util_1.0.500.v20130404-1337.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.osgi.services_3.4.0.v20131120-1328.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.ds_1.4.200.v20131126-2331.jar"));
//install servlet module
installedBundles.add(context.installBundle("file:///MY_PATH\\app.jar"));
for (Bundle bundle : installedBundles) {
bundle.start();
}
}
我的灵感来自 Peter Fries 博客 ( http://www.peterfriese.de/osgi-servlets-flexibility-by-simplicity/ ) 的示例,但我无法初始化 httpService 实例。甚至只有当 @Reference 注解被删除或被注释覆盖时,App 模块才能启动,否则模块将不会被激活。
我怀疑我的嵌入式 OSGI 没有某些必需的模块,但无法获取有关它的详细信息 - 日志控制台没有说什么。
感谢巴拉兹的提示!
我的错误有:
0.当<Embed-Dependency>!org.osgi.core</Embed-Dependency>
声明httpService不能通过@Reference注解自动绑定(bind),所以bind = "bindHttpService", unbind = "unbindHttpService"
是没用的。我删除了<Embed-Dependency>
声明,它有助于绑定(bind) httpService,就像我想要的那样(通过 bindHttpService)。
在 OSGI 服务器上安装 bundle 之前,应指定 jetty 设置:
System.setProperty("jetty.port","8080");
System.setProperty("jetty.home.bundle", "org.eclipse.jetty.osgi.boot");
在我的例子中,嵌入式 OSGI 服务器上必须安装太多 jars
//强制 bundle installedBundles.add(context.installBundle("file:///MY_PATH\org.eclipse.equinox.util_1.0.500.v20130404-1337.jar")); installBundles.add(context.installBundle("file:///MY_PATH\org.eclipse.equinox.ds_1.4.200.v20131126-2331.jar"));installBundles.add(context.installBundle("file:///MY_PATH\org.eclipse.osgi.services_3.4.0.v20131120-1328.jar"));installBundles.add(context.installBundle("file:///MY_PATH\javax.servlet-api-3.0.1.jar"));
// Container bundles
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.security_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.servlet_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.continuation_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.server_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.util_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.io_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.jetty.http_8.1.12.v20130726.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.http.servlet_1.1.400.v20130418-1354.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.http.jetty_3.0.200.v20131021-1843.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.http.servletbridge_1.0.300.v20130327-1442.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.servletbridge_1.3.0.v20130927-1541.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.common_3.6.200.v20130402-1505.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.registry_3.5.400.v20130717-1325.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.eclipse.equinox.http.registry_1.1.300.v20130402-1529.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\org.osgi.service.obr-1.0.2.jar"));
// Service bundles
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-httpservice-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\ow2-httpservice-1.2-spec-1.0.0.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-osgi-boot-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-deploy-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-webapp-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-security-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-http-8.0.4.v20111024.jar"));
installedBundles.add(context.installBundle("file:///MY_PATH\\jetty-xml-8.0.4.v20111024.jar"));
// Finally, required OSGI bundle
installedBundles.add(context.installBundle("file:///MY_PATH\\app.jar"));
通过这些更改,我有了一个初始化的 httpService 对象,现在我想注册我的 servlet 实例
@Activate
protected void startup() {
MyServlet servlet = new MyServlet();
if (httpService != null) {
System.out.println("Greetings! I just want to be sure that service isn't null!")
//httpService.registerServlet("/req", servlet, null, null); // BAD PLACE
} else {
System.out.println("Something goes wrong")
}
}
上面的代码片段将显示“Greetings”消息,但如果我尝试注册 servlet 并取消注释“BAD PLACE”,则不会显示该消息,什么也没有发生。异常也是无法捕获的;看起来“启动”方法被忽略了。任何想法出了什么问题吗?
最佳答案
我没有看到您添加任何包含任何 servlet 容器(jetty 或 tomcat)的 bundle 。我也没有在您的列表中看到包含 HttpService 实现的包。
如果您需要一个工作示例,请参阅依赖项 here在“具有 HTTP 服务的 Jetty”部分下。如果您将这些依赖项及其依赖项传递导入,您将拥有一个带有 HttpService 的 Jetty 服务器。在示例中,依赖项被注释掉,因为它们仅在开发时使用。请注意,您必须按照定义以下系统属性的方式启动嵌入式 servlet 容器:
jetty.port=8080
jetty.home.bundle=org.eclipse.jetty.osgi.boot
如果您通过 Google 搜索,您可以找到 Tomcat 或 Jetty 的其他 bundle 集。
关于java - OSGI HttpService 无法正确初始化/注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290506/
我通常是一名 PHP 开发人员,几乎没有使用 javascript/typescript 的经验。刚开始使用 NestJS - 我想要一个端点,该端点返回一个 requisitions 列表,该列表是
感谢 HttpService,我正在开发 servlet 并将它们注册到我的 OSGI 容器中。我的目标是保护在我的 OSGI 容器中注册的所有 servlet。我看到我可以使用我自己的 handle
我试图在httpservice上设置json内容类型,以使REST服务返回json数据。当我在 fiddler 中添加内容类型时,所有内容都可以正常工作,因此问题出在Flex应用程序中,而不是Web服
我正在开发一个基于 OSGi 的应用程序,该应用程序使用 org.osgi.service.http.HttpService,它不支持使用 Servlet 过滤器。 在我意识到我无法使用 Servle
我正在尝试注册本地路径资源(OSGi bundle 之外),但它不起作用。这很奇怪,因为你还能如何使用 jar 中不存在的资源呢? 这是我的代码: protected void bindHttpSer
如何使用 NestJs 在 HttpService 上使用 Async/Await?以下代码不起作用: async create(data) { return await this.httpS
我有一个用于监控服务器的 Angular 2 工具,并且刚刚开始测试。当我尝试模拟 httpService 时,我不知道如何模拟 Rest-API,所以我上网查找,修复了一些错误,现在被困在这个问题上
我使用 URLLoader 将数据加载到我的 Flex 应用程序(主要是 XML)中,我做同样事情的伙伴主要使用 HTTPService。是否有特定或正当的理由使用 on 而不是另一个? 最佳答案 H
我正在尝试测试 NestJS 内置的 HttpService(基于 Axios)。不过,我在测试错误/异常状态时遇到了麻烦。在我的测试套件中,我有: let client: SomeClearingF
为什么 Flex 中有两个不同的 HTTPService 类? this 和 this 第二个继承了第一个。 为什么不能有一个类(class)将两者结合起来? 最佳答案 其中一个对象(您发布的第一个链
好的,我有一个 HTTPService,只要它从 send() 调用获得结果,它就会执行 dataLoaded(e:ResultEvent):void 函数。 好的,所以如果我调用 HTTPServi
我想我快疯了,因为我对 node 和 typescript 还很陌生……我只是想以同步的方式检索 http get 请求的结果。 鉴于: import { Injectable, HttpServic
我有一个可用的 .Net WCF HTTP 服务。如果我将 URL 放入 I.E、FireFox 或谷歌 Chrome 浏览器中,我会返回正确的流。但是,当我尝试在 android 应用程序(在 Ec
现在,我将 URL 硬编码为 HTTPService 以与本地计算机的网络服务器一起工作,这样我就不需要在编译后将文件复制到 htdocs。有什么好方法可以轻松地将 HTTPService URL 从
我想在我的 OSGI 项目中为我的 servlet 使用声明性服务功能。详细信息:用户可以在主应用程序上手动安装模块,选择一些 *.jar 文件,主应用程序嵌入了 OSGI 服务器,当 OSGI 模块
我想知道是否可以使用 HttpModule 中的 HttpService 记录请求、响应和错误。 我以前使用 AXIOS 的拦截器,HttpService 包装了 axios 但我似乎无法在这里添加任
我使用基本的 Post 将数据发送到 Django 服务器。 数据由 flex 动态创建的 base64 编码的 640*380 PNG 图像组成组件。 private function sendF
我使用 NestJS 本质上是使用 HttpService(一个可观察的包装 Axios 库)将请求代理到另一个 api。例如: return this.httpService.post(...)
我正在将我的应用程序迁移到最新的 RC,但遇到了一些我无法修复的错误。在决定在这里问之前,我进行了彻底的搜索,但没有任何运气。 因此,当按下按钮时,应加载以下内容: 这是组件: import { Co
我有一个 NestJS 应用程序,它充当前端和多个其他后端之间的代理。 我基本上希望能够将来自 Controller 中传入的@Req(请求)的特定 header (授权)传递给 HttpServic
我是一名优秀的程序员,十分优秀!