0

我目前正在尝试使用 OSGI 远程服务公开 restful webservice,但似乎我在 ECF 教程中遗漏了一些东西。下面是 impl 类:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.example.api.HelloWorldService;
import org.osgi.service.component.annotations.Component;

@Path("/helloworld")
@Component(property = { "service.exported.interfaces=HTTP", 
"service.exported.configs=ecf.jaxrs.jersey.server",
    "ecf.jaxrs.jersey.server.alias=/jersey" })
public class HelloWorldResource implements HelloWorldService {
@GET
@Produces("text/plain")
public String getMessage() {
    // Return some textual content
    return "Hello World";
}}

我按照此链接了解事物如何结合在一起,但我无法根据 jax-rs 路径注释获得 HTTP 200 ok 消息

https://wiki.eclipse.org/Tutorial:_Using_REST_and_OSGi_Standards_for_Micro_Services

在此处输入图像描述

请注意,所有捆绑包都已正确解析。 在此处输入图像描述

4

4 回答 4

1

如果您尚未使用,请更新到 ECF 3.14.0。此外,3.14.0/Photon 之后(最近几周),JaxRS 提供程序发生了重大变化,以支持 OSGi R7 异步远程服务,因此请确保您也拥有来自 JaxRSProviders 的最新版本。所需的远程服务属性已根据 R7 更改而更改。请参阅 hello 示例的服务属性和在 Karaf 上运行 hello 示例的简短教程:

https://wiki.eclipse.org/Tutorial:_JaxRS_Remote_Services_on_Karaf

简而言之,不再需要指定 ecf.jaxrs.jersey.server.alias 但还有其他(新标准化)属性需要设置。

我想创建一个 bndtools4 JaxRS 运行描述符模板,我认为这会让你更容易。我怀疑您的问题可能是没有所有必要的球衣捆绑包,因为球衣有很多依赖项......所有这些都必须存在才能成功导出远程服务。对于参考,这是使用当前存在的项目和 bndrun 模板的设置信息:

https://wiki.eclipse.org/Bndtools_Support_for_Remote_Services_Development

我将为 CXF 和 Jersey 分发提供程序创建一个 bndtools4 bndrun 模板,但是自从 JaxRSProvider 更改以来还没有足够的时间。如果您想表达您对 bndrun 模板和/或帮助贡献的愿望,请在https://github.com/ECF/JaxRSProviders/issues上打开一个问题,这将有助于跟踪。

同时,捆绑包的示例列表位于此处的产品文件中:

https://github.com/ECF/JaxRSProviders/tree/master/examples/com.mycorp.examples.student.remoteservice.host/launch

于 2018-07-11T19:16:17.890 回答
1

我已经为你的 hello jaxrs 服务创建了一个 bndtools4 bndrun。首先,您需要使用 ECF bndtools.workspace 模板创建一个新工作区。只需按照此处的说明进行操作:

https://wiki.eclipse.org/Bndtools_Support_for_Remote_Services_Development

用于从 ECF bndtools.workspace 模板创建工作区。就在今天,我已将 JaxRS 包添加到此工作区模板中。

然后我用这个接口创建了一个 org.example.api 项目

package org.example.api;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/helloworld")
public interface HelloWorldService {

    @GET
    @Path("/hello")
    @Produces("text/plain")
    String getMessage();
}

请注意,它与您的略有不同,因为它有一个用于 getMessage() 方法的 @PATH 注释。

然后在另一个项目中......名为 org.example.impl 有这个类:

package org.example.impl;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.example.api.HelloWorldService;
import org.osgi.service.component.annotations.Component;

@Path("/helloworld")
@Component(property = { "service.exported.interfaces=*", 
"service.intents=jaxrs" })
public class HelloWorldResource implements HelloWorldService {
    @GET
    @Path("/hello")
    @Produces("text/plain")
public String getMessage() {
    // Return some textual content
    return "Hello World";
}}

jaxrs 注释与接口相同(应该如此)。少了

这是 bndrun(我称之为 jettyserver.bndrun):

-runrequires: \
    bnd.identity;id='org.eclipse.ecf.provider.jersey.server',\
    osgi.identity;filter:='(&(osgi.identity=javax.validation.api)(version>=1.1.0))',\
    osgi.identity;filter:='(&(osgi.identity=org.apache.felix.gogo.command)(version>=1.0.2))',\
    osgi.identity;filter:='(&(osgi.identity=org.apache.felix.gogo.runtime)(version>=1.0.10))',\
    osgi.identity;filter:='(&(osgi.identity=org.slf4j.api)(version>=1.7.2))',\
    bnd.identity;version='latest';id='org.example.impl',\
    bnd.identity;id='org.apache.felix.gogo.command',\
    bnd.identity;id='org.apache.felix.gogo.runtime',\
    bnd.identity;id='org.apache.felix.gogo.shell',\
    bnd.identity;id='org.eclipse.ecf.osgi.services.remoteserviceadmin.console',\
    bnd.identity;id='org.apache.felix.scr',\
    bnd.identity;id='org.eclipse.ecf.osgi.services.distribution',\
    bnd.identity;id='org.eclipse.ecf.provider.jersey.client'
-runfw: org.apache.felix.framework;version='[5.6.10,5.6.10]'
-runee: JavaSE-1.8
-runbundles: \
    com.fasterxml.jackson.core.jackson-annotations;version='[2.9.2,2.9.3)',\
    com.fasterxml.jackson.core.jackson-core;version='[2.9.2,2.9.3)',\
    com.fasterxml.jackson.core.jackson-databind;version='[2.9.2,2.9.3)',\
    com.fasterxml.jackson.jaxrs.jackson-jaxrs-base;version='[2.9.2,2.9.3)',\
    com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider;version='[2.9.2,2.9.3)',\
    javax.annotation;version='[1.2.0,1.2.1)',\
    javax.inject;version='[1.0.0,1.0.1)',\
    javax.persistence;version='[2.2.0,2.2.1)',\
    javax.validation.api;version='[1.1.0,1.1.1)',\
    javax.ws.rs;version='[2.0.1,2.0.2)',\
    org.aopalliance;version='[1.0.0,1.0.1)',\
    org.apache.felix.configadmin;version='[1.8.16,1.8.17)',\
    org.apache.felix.eventadmin;version='[1.4.10,1.4.11)',\
    org.apache.felix.gogo.command;version='[1.0.2,1.0.3)',\
    org.apache.felix.gogo.runtime;version='[1.0.10,1.0.11)',\
    org.apache.felix.http.jetty;version='[3.4.8,3.4.9)',\
    org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
    org.apache.felix.scr;version='[2.0.14,2.0.15)',\
    org.eclipse.core.jobs;version='[3.9.3,3.9.4)',\
    org.eclipse.ecf;version='[3.9.0,3.9.1)',\
    org.eclipse.ecf.discovery;version='[5.0.300,5.0.301)',\
    org.eclipse.ecf.identity;version='[3.9.0,3.9.1)',\
    org.eclipse.ecf.osgi.services.remoteserviceadmin;version='[4.6.800,4.6.801)',\
    org.eclipse.ecf.osgi.services.remoteserviceadmin.proxy;version='[1.0.100,1.0.101)',\
    org.eclipse.ecf.provider.jaxrs;version='[1.3.0,1.3.1)',\
    org.eclipse.ecf.provider.jaxrs.server;version='[1.4.0,1.4.1)',\
    org.eclipse.ecf.provider.jersey.server;version='[1.3.0,1.3.1)',\
    org.eclipse.ecf.remoteservice;version='[8.13.0,8.13.1)',\
    org.eclipse.ecf.remoteservice.asyncproxy;version='[2.1.0,2.1.1)',\
    org.eclipse.equinox.common;version='[3.9.0,3.9.1)',\
    org.eclipse.equinox.concurrent;version='[1.1.0,1.1.1)',\
    org.eclipse.equinox.supplement;version='[1.7.0,1.7.1)',\
    org.eclipse.osgi.services.remoteserviceadmin;version='[1.6.200,1.6.201)',\
    org.glassfish.hk2.api;version='[2.5.0,2.5.1)',\
    org.glassfish.hk2.osgi-resource-locator;version='[2.5.0,2.5.1)',\
    org.glassfish.hk2.utils;version='[2.5.0,2.5.1)',\
    org.glassfish.jersey.bundles.repackaged.jersey-guava;version='[2.22.1,2.22.2)',\
    org.glassfish.jersey.containers.servlet.core;version='[2.22.1,2.22.2)',\
    org.glassfish.jersey.core.jersey-common;version='[2.22.1,2.22.2)',\
    org.glassfish.jersey.core.jersey-server;version='[2.22.1,2.22.2)',\
    org.glassfish.jersey.ext.entityfiltering;version='[2.22.1,2.22.2)',\
    org.glassfish.jersey.media.jersey-media-json-jackson;version='[2.22.1,2.22.2)',\
    org.slf4j.api;version='[1.7.2,1.7.3)',\
    org.example.api;version=snapshot,\
    org.example.impl;version=snapshot,\
    org.apache.felix.gogo.shell;version='[1.0.0,1.0.1)',\
    org.eclipse.ecf.console;version='[1.1.0,1.1.1)',\
    org.eclipse.ecf.osgi.services.remoteserviceadmin.console;version='[1.0.0,1.0.1)',\
    org.eclipse.ecf.osgi.services.distribution;version='[2.1.200,2.1.201)',\
    javassist;version='[3.13.0,3.13.1)',\
    org.eclipse.ecf.provider.jaxrs.client;version='[1.3.0,1.3.1)',\
    org.eclipse.ecf.provider.jersey.client;version='[1.3.0,1.3.1)',\
    org.glassfish.hk2.locator;version='[2.5.0,2.5.1)',\
    org.glassfish.jersey.core.jersey-client;version='[2.22.1,2.22.2)'

经您许可,我想将 jaxrs hello api 和 impl 项目的 bndtools 项目模板添加到 ECF bndtools.workspace 存储库,以及 jersey 和 cxf bndrun 服务器和客户端模板(一旦我完成它们)。我将在接下来的几天内创建 bndrun 并进行测试。

于 2018-07-12T02:01:54.607 回答
1

导出的接口属性不应为“HTTP”。相反,它必须是接口 fqname 或 Star。所以试试这个:

"service.exported.interfaces=*"
于 2018-07-10T04:41:16.513 回答
0

有关信息:

我为 JaxRS API、Impl、Consumer 项目(基于 HelloWorldService)添加了项目模板,并为 Jersey 服务器和客户端以及 CXF 服务器和客户端添加了 bndrun 模板。

请参阅https://github.com/ECF/JaxRSProviders/issues/6

于 2018-07-13T01:12:22.797 回答