- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究如何将 Eclipse 插件公开为 Web 服务,但我感到很困惑。
我的要求基本上是为一组 Web 服务构建 Equinox 后端。我将大量使用 EMF 和相关项目,因此考虑到这个目标,我一直在阅读有关 Equinox/OSGI 以及构建我需要的选项的信息。
然而,还是有一些神秘的地方,而且周围有大量的项目。鉴于以下发现,我想听听您的建议。也许我缺少一个选项,或者您以前已经这样做过。这是提名者(鼓乐)
在 Web 容器中托管 Equinox。使用bridge.war,插件可以公开servlet。问题是,要使用良好的 REST 框架,例如 RestEasy(我最喜欢的),REST 框架需要是位于 Equionox 运行时中的 osgi 包。我花了 3 天,由于类加载器问题,这不起作用。我现在确信我将无法在 Equinox 中使用 RestEasy。我可以在 Web 容器中使用 RestEasy,并使用 XML 序列化/反序列化使 Web 容器中的代码与 Equionox 中的代码进行对话,但这感觉像是浪费资源。不过,这可能有效。
另一个选项似乎是ECF,它是分布式OSGI的实现,它似乎支持SOAP/Rest。但是,我找不到仅将 Equinox 托管功能公开为 Web 服务的清晰教程。所以这仍然迫使我不使用 RestEasy,但至少它似乎给了我一个与 Equinox 对话的适当框架。为了可扩展性,我可能仍然需要将其保存在网络容器中。
然后是 Eclipse Virgo,它似乎支持与 OSGI 运行时一起托管 Web 应用程序,并且显然 Web 容器托管代码可以与 OSGI 运行时代码对话。不过,我不确定是否可以传递类,因为在 Web 容器下创建的 Jaxb 带注释的类型 A 可能使用与 OSGI 运行时插件不同的类加载器。另外,这个设置将我锁定在 Virgo,我宁愿使用 JBoss 等进行生产使用。
因此,考虑到这些选项,以及可能还有更多我目前不知道的选项,您将如何将 EMF 和其他基于 Eclipse 框架的项目公开为 Web 服务?
编辑:基于大家的热烈响应,我想补充更多内容。部分是问题的细节,部分是不适合评论部分的评论。
我对这个问题的研究让我得到了与公认答案完全相同的观点:Apache CXF 现在是分布式 OSGI 的实现,这很好。我已经放弃了 RestEasy。我当前担心的是,我已经有一个创建了我的类的 XSD。 RestEasy 使暴露这些变得非常容易,我也必须在这里做同样的事情。我的插件必须使用这些基于 JAXB 的类。在最坏的情况下,我可能会尝试使用提供 JAXB 支持的 Eclipse Link 项目来创建 XML 内容,并通过基本 servlet 使用或作为基于 CXF 的字符串值传递它。因此,这里讨论的解决方案感觉并不完美,但我想这是目前可以做的最好的解决方案。
最佳答案
我开发的产品已经做到了这一点。我们的 Web 容器中有 Equinox。我们使用 Apache CXF 公开 SOAP 和 REST Web 服务。需要一些黑魔法才能正确连接所有东西。我发现 CXF 文档不太好,特别是对于 OSGI。
我相信您知道,在 Web 容器中托管 Equinox 并不是一种推荐的做法,尽管如果您想使用 OSGI,这是很难避免的做法。我们也遇到了许多类加载问题。事实上,我们从未真正享受过 OSGI 所宣传的好处(模块化等)。现在我们想回头已经太晚了。 OSGI 不应轻易进入。
以下是我们如何使用 CXF 启用 SOAP/REST 的快速概述。希望这至少能为您指明正确的方向。
1) 安装 CXF OSGI bundle ,包括核心和 DOSGI - 我们使用以下内容: cxf-bundle-minimal-2.2.12.jar cxf-dosgi-ri-discovery-local-1.1.jar cxf-dosgi-ri-dsw-cxf-1.1.jar 链接: http://cxf.apache.org/download.html
2) 安装 JAX-RS (REST) 和 JAX-WS (SOAP) API- API 定义位于 org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar 和 org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar 中(这些是版本我们有)- 这些可能会也可能不会与 CXF 捆绑在一起。在我们的例子中,仅包含 JAX-WS jar。我们必须寻找 JAX-RS bundle 。-除了在web应用程序(WEB-INF/eclipse/plugins)中安装 bundle 之外,我们还必须将它们添加到ECLIPSE/plugins目录中进行编译。
3) 告诉 Equinox 加载 CXF 插件。可能还有其他方法可以做到这一点。我们通过 WEB-INF/eclipse/configuration/config.ini 中的条目来完成此操作。-如果此文件存在,请将新 jar 添加到 osgi.bundles 属性中:osgi.bundles=... org.apache.servicemix.specs.jaxb-api-2.1-1.1.1.jar@start, org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar@start ,org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar@start,\ cxf-dosgi-ri-discovery-local-1.1.jar@5:开始,\ cxf-bundle-minimal-2.2.12.jar@5:开始,\ cxf-dosgi-ri-dsw-cxf-1.1.jar@5:开始
4) 就是这样。您现在应该能够开始编写 SOAP 和 REST 服务。这是 Java 优先的方法(与 XML 模式优先相反)。这意味着您:- 定义Java接口(interface)- 配置 CXF 将您的接口(interface)发布为 REST 或 SOAP 端点。
这是一个非常简单的 REST 示例。它带有标准免责声明,表明它特定于我们的环境。 YMMV。
a) 我们使用声明式服务,因此首先我们在 bundle 的 list 中定义 DS 文件 服务组件:META-INF/ds/helloworld.xmlb) 这是 DS 文件:META-INF/ds/helloworld.xml。 DS 文件定义了 OSGI 包中的服务及其依赖项。为了简洁起见,这些条目已被省略。
<?xml version="1.0"?>
<components xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">
<component name="hello_world_service" xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">
<!-- Defines this as a REST service --->
<property name="service.exported.configs" value="org.apache.cxf.rs"/>
<!-- This is the URI of your REST resource.
It is realtive to the Equinox bridge servlet in your webapp -->
<property name="org.apache.cxf.rs.httpservice.context" value="/helloworld" />
<!-- This is the java interace that will be exposed . You
will use JAX-RS annotations to map these java methods to HTTP verbs. -->
<property name="service.exported.interfaces" value="com.foo.IHelloWorldService"/>
...
</components>
c) 这是接口(interface)类:
package com.foo;
@Path("/greeting")
public Interface IHelloWorldService {
@GET
@Produces("application/xml")
public Greeting getGreeting();
}
public class HelloWorldService implements IHelloWorldService {
@override
public Greeting getGreeting() {
Greeting g = new Greeting();
g.message = "Hello World";
return g;
}
}
d) 因此,一旦一切就绪,您应该能够获取以下 URL:
/<web-app-name>/bridge/helloworld/greeting
并收到以下响应:
<Greeting>
<message>Hello World</message>
</Greeting>
祝你好运。希望这会有所帮助。
关于java - 如何将 Eclipse 插件公开为 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8357716/
例如 Form1 frm1 = new Form1(); TextBox tb = new TextBox(); frm1.Controls.Add(tb); 现在我不能说 f
我有一个日期过滤器,我已经在我的 View 中公开了它。我想让界面更加用户友好并加强它的外观。我不想选择日期,而是从以下选项中进行选择。 最后一天 上周 去年 全部 然后,这将过滤日期字段。这可能吗?
如何向用户公开我的用户控件组件之一的 ActualWidth 属性? 我找到了很多关于如何通过创建新的依赖属性和绑定(bind)来公开普通属性的示例,但没有关于如何公开像 ActualWidth 这样
Github 最近推出了项目功能。 当项目处于 repo 级别时,如果 repo 本身是公开的,那么任何人都可以访问这些项目。 但是,组织级别的项目仅对组织成员可见。 例如,https://githu
我想要从我的网络服务器访问 JavaScript 文件。 以便任何人都可以在其网站中访问和引用它。 e-g 假设 abcxyzserver.com 是我的网络服务器。 www.abcxyzserv
尝试使用curl命令上传到blob存储 curl --upload-file --url "https://.blob.core.windows.net//" 但不断收到“HTTP/1.1 404
我正在尝试获取 Canvas 的上下文,显然我收到错误Uncaught TypeError: Cannot call method 'getContext' of null 显然我在它初始化之前就得到
我正在对设置 HA 集群的解决方案进行故障排除。虽然我知道应用程序执行故障转移和故障回复所需的端口,但不知何故 dockerized 解决方案不起作用。我怀疑有一些我还不知道的端口。 目前,我的 EX
我试图在能够使用 Helm 运行的k8集群中设置Prometheus。当我使用外部IP将Prometheus-Server作为LoadBalancer服务公开时,访问仪表板。 当我尝试将此服务配置为C
我知道关于这个主题也有类似的问题,但我不完全确定他们正在解决同样的问题。所以要明确的是... 我有一个现有的类库,其中包含用于类型、业务逻辑和数据访问的命名空间。逻辑和数据访问命名空间中的类是静态的,
尝试使用curl命令上传到blob存储 curl --upload-file --url "https://.blob.core.windows.net//" 但不断收到“HTTP/1.1 404
1.)执行以下命令生成一个随机数,用于后面的步骤 NUMBER=$[ ( $RANDOM % 1000 ) + 1 ] echo $NUMBER 注意:将句子 your random number 替
类似这样的问题有很多,但仍然无法得到我真正想要的,而且它们都有一些与我不同的地方,那就是:我有一个 UserControl: 在名为UCProject 的类库项目中单独构建; UCProject 项目
我有一个这样的基类: public class BaseModalCommand { protected object m_commandArgument; protected i
给定以下 JQuery 插件。是否可以将变量“元素”公开给插件外部的 javascript?如果是这样,这是怎么做到的?对于此插件外部的 javascript,访问“元素”的语法是什么? (funct
我有两个使用 jhipster 创建的微服务。 (ms1 和 ms2) 我使用 AuthorizedFeignClient 在两个微服务之间进行通信。 ms1 有一些 DTO 类,用作 REST AP
我正在使用错误跟踪软件来报告网络浏览器中发生的任何错误,但我的生产站点上的代码已缩小。因此,调试几乎是不可能的(变量名被更改等)。 我想将完整的源映射文件投入生产,以便我可以调试这些错误,但在这样做时
我在 Kotlin 公开库中可以找到的所有 Material 都假定该表具有一个主标识列,因此在大多数示例中显示的实体继承了 IntEntity 抽象类。例如: class UserLocation(
我有一个类 (Capsule),它有很多 protected 方法 (30+)。这个想法是允许开发人员扩展此类并在类 (ImADev) 中使用 protected 方法,但将其留给开发人员将它们公开为
Tomcat 日志位置是: /apache/apache-tomcat-8.0.15/logs 允许通过浏览器访问这些日志的标准方法是什么? 为此启用 Tomcat 目录列表标准吗? 最佳答案 我曾在
我是一名优秀的程序员,十分优秀!