【问题标题】:Jersey, osgi and Servlet context 3.xJersey、osgi 和 Servlet 上下文 3.x
【发布时间】:2013-11-14 13:22:18
【问题描述】:

我正在使用 Jersey 2.x 和 OSGI 开发应用程序。 为了注册球衣的端点(ServletContainer),我使用 osgi 的 HTTPService 和一个 Jetty 8.x 的实现 我想使用 SSE(服务器发送事件),但不幸的是,当我使用实现它的服务时,告诉我 这不会在 Servlet Context 2.x 中运行 奇怪的是我使用的堆栈是servlet 3.x。 如果我使用 SSE 支持制作一个简单的 servlet,那么无论 JAX-RS 是什么都可以。 我认为 Jersey 开始考虑在 servlet 容器 2.x 上运行,而不是如何改变它。 我没有任何 web.xml,因为它是本机应用程序 OSGI。

这是使用 OSGI 的简单初始化:

httpService.registerServlet ("/ kratos / rest" (HttpServlet) ServletContext, null, null);

其中 servletContext 是 ServletContainer 的一个实例。

然后是ServletContainer实例,我们添加JAX服务动态重载应用。

有什么建议吗?

谢谢....

编辑...

这些是一些捆绑包:

karaf@root> la  | grep Se
[   3] [Active     ] [            ] [    8] OPS4J Pax Logging - Service (1.7.1)
[   5] [Active     ] [            ] [   10] Apache Felix Configuration Admin Service (1.6.0)
[  10] [Active     ] [            ] [   20] Apache Aries Proxy Service (1.0.1)
[  49] [Active     ] [Created     ] [   30] Apache Karaf :: Management :: MBeans :: Services (2.3.3)
[  54] [Active     ] [            ] [   30] Apache ServiceMix :: Specs :: Activation API 1.4 (1.9.0)
[  55] [Active     ] [            ] [   30] Servlet 3.0 (1.0)
[  60] [Active     ] [            ] [   30] Jetty :: Aggregate :: All Server (8.1.9.v20130131)
[  67] [Active     ] [            ] [   30] Apache ServiceMix :: Bundles :: asm (3.3.0.2)
[  69] [Active     ] [            ] [   30] OPS4J Pax Web - Service SPI (3.0.2)
[ 105] [Active     ] [            ] [   80] Apache ServiceMix :: Bundles :: javax.inject (1.0.0.1)
[ 112] [Active     ] [            ] [   80] ServiceLocator Default Implementation (2.2.0.b10)
[ 121] [Active     ] [            ] [   80] Apache ServiceMix :: Bundles :: aopalliance (1.0.0.5)

这是一个例外:

013-11-03 20:50:27,708 | WARN  | qtp18651544-59   | ServletHandler                   | pse.jetty.servlet.ServletHandler  492 | 60 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.9.v20130131 | 
javax.servlet.ServletException: java.lang.UnsupportedOperationException: Asynchronous processing not supported on Servlet 2.x container.                                                                                         
Caused by: java.lang.UnsupportedOperationException: Asynchronous processing not supported on Servlet 2.x container.                                                                                                              
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:983)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:359)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        ... 29 more
2013-11-03 20:50:27,710 | WARN  | qtp18651544-59   | ServletHandler                   | pse.jetty.servlet.ServletHandler  517 | 60 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.9.v20130131 | /kratos/rest/sse
java.lang.UnsupportedOperationException: Asynchronous processing not supported on Servlet 2.x container.
        at org.glassfish.jersey.servlet.WebComponent$1.suspend(WebComponent.java:120)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.glassfish.jersey.servlet.internal.ResponseWriter.suspend(ResponseWriter.java:109)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:621)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:357)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:347)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:258)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318)[149:org.glassfish.jersey.core.jersey-common:2.3.1]
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:983)[150:org.glassfish.jersey.core.jersey-server:2.3.1]
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:359)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)[147:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:69)[71:org.ops4j.pax.web.pax-web-jetty:3.0.2]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:210)[71:org.ops4j.pax.web.pax-web-jetty:3.0.2]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:77)[71:org.ops4j.pax.web.pax-web-jetty:3.0.2]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.Server.handle(Server.java:368)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:932)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:994)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131]
        at java.lang.Thread.run(Thread.java:724)[:1.7.0_40]

例子:

注意:我将 Peaberry 用于 DI。

Activator.java

public class Activator implements BundleActivator {

   ....
   ....

   @Override
   public void start(final BundleContext bc) throws Exception {

        System.out.println("Starting Activator");

        final ClassLoader primaryClassLoader = getDatanucleusClassLoader(bc);

        Injector injector = Guice.createInjector(Peaberry.osgiModule(bc), new AbstractModule() {
            @Override
            protected void configure() {

                install(new CoreResourcesJaxRsModule());
                ...
                ...
                 bind(HttpService.class).toProvider(Peaberry.service(HttpService.class).single());

                ...
             }
        });
   }
}

ConfigHttpService.java:

单例 公共类 ConfigHttpService {

private final ServletContainer servletContext;
private final HttpService httpService;
private final BundleContext context;
private boolean initialized = false;

private static final Logger logger = Logger.getLogger(ConfigHttpService.class.getName());

@Inject
public ConfigHttpService(
        BundleContext bc,
        HttpService httpService, 
        ServletContainer context) {
    this.servletContext = context;
    this.httpService = httpService;
    this.context = bc;
}

public synchronized void init() throws Exception {
    if (!initialized) {
        try {
            logger.info("Configurado el registro de Guice");
            //httpService.registerFilter( guiceFilter, "/.*", null, 0, null );
            try {

                logger.info("Configurado el registro de recursos estaticos");
                httpService.registerResources("/kratos/pages", "/pages", null);

                 logger.info("Servlet /kratos/events configurado");
                 Dictionary d1 = new Hashtable();
                 d1.put("javax.ws.rs.Application", "com.workingflows.kratos.core.service.KratosServiceApplication");

                 httpService.registerServlet("/kratos/rest", (HttpServlet) servletContext, d1, null);




                //httpService.registerResources("/kratos", "/js", null);
            } catch (NamespaceException ex) {
                logger.info("Error NamespaceException");
            }
        } catch (ServletException ex) {
            logger.info("Error ServletException");
        }
        initialized = true;
    }

}

@Stop
public void stop() {
    logger.log(Level.INFO, "Eliminando el servlet {0}", "/kratos/rest");
    httpService.unregister("/kratos/rest");
    httpService.unregisterFilter(guiceFilter);
}

}

ConfigHttpService.init() 方法是从代表内部模块的其他类调用的。在这个方法中,您将看到 JAX ServletContext 的配置。

【问题讨论】:

  • 是什么让您认为您是在 Servlet 3.0 堆栈中运行的?
  • 项目依赖为servlet 3.x。我也有一个 servlet 异步,它工作正常。但是 JAX 就像在 2.x 上运行一样
  • 我编辑了原帖,哪里会看到异常和一些依赖。
  • 项目依赖可能意味着构建依赖,对吧?但它们无关紧要,因为错误发生在运行时,而不是构建时。
  • 因为它与 Pax-Web 3.0.2 一起运行,所以 Servlet 3.0 可用。可能想在 ops4j 邮件列表中提问并提供样本。

标签: java servlets jersey osgi


【解决方案1】:

错误是球衣模块是在与注册 ServletContainer 类的应用程序模块相同的级别上启动的。

[ 127] [  Resolved] [   30] jersey-container-servlet-core (2.4.0)
[ 161] [    Active] [   30] jersey-core-common (2.4.0)
[ 162] [    Active] [   30] jersey-core-client (2.4.0)
[ 163] [    Active] [   30] jersey-core-server (2.4.0)
[ 164] [    Active] [   30] jersey-container-servlet (2.4.0)
[ 165] [    Active] [   30] jersey-media-sse (2.4.0)

我在第 30 级开始堆叠球衣,在第 80 级开始申请,一切正常!!!!重要的模块是 jersey-core-server,它增加了对 servlet 3.x 的支持。

[ 168] [    Active] [   80] OsgiJersey OSGi Bundle (1.0.0.SNAPSHOT)

参见my repository中的示例

【讨论】:

    【解决方案2】:

    我认为我们可能有更好的解决方案,而不是直接使用 HttpService,您可以使用 WhiteBoard 扩展器(只需为此安装 http-whiteboard 功能)。通过这种方式,您将 Servlet 注册为服务,白板扩展程序将获取此信息,另请参见 pax-web samples 之一。或者当您正在开发 Servlet 3.0 Servlet 时,只需通过注释 Servlet 来注册它。您需要做的就是将 web-contextPath 添加到 Bundle 的清单中。另请参阅我的blog。

    如果这仍然没有帮助,我可能需要将工作示例发送到 ops4j 邮件列表,或者将问题添加到 pax-web,以便我可以更深入地了解它。顺便提一句。 CXF 确实使用了白板方法,并且像魅力一样工作 ;)

    【讨论】:

    • 我更改了代码,并使用 WebContainer 注册了一个 servlet(泽西岛的 ServletContainer)。但是错误是NOT FOUND!!!尝试访问 jax 资源时在浏览器中。如果我将 webContainer 更改为 httpService,则可以正确访问资源。但是,对于 httpService,错误出现在我使用 SSE 时,如帖子中所述。
    • 因为我之前从未使用过泽西岛,如果你能提供一个小样本让我自己尝试,那真的很棒,请在 ops4j 邮件列表中提供,否则我无法提供任何进一步的帮助...... .
    • @AchumNierbeck 我会做一个小例子,我会上传。我发现 HTTPService 和 WebContainer 类之间记录路由的方式有所不同。 1) httpservice.registrerServlet("/rest/", ......) 2) webcontainer.registrerServlet( servlet, "Name", new String[]{"/rest/*"} ...) 1) 仅 "/rest" 2) 如果不添加 /* 未找到任何资源。但问题是,我认为是泽西岛,这没有发现在 servlet 3.x 容器中运行。任何其他 servlet 都可以与 WebContainer 类完美运行。我将上传一个带有代码的示例。谢谢。
    • 这就是为什么我需要一个样本来调试,并检查 Pax-Web 是否需要“提供”一些东西来告诉 Servlet 的版本:-)
    • @AchumNierbeck 这是我的存储库 (OsgiJersey) 中一个示例的 link。我使用 pax-web 3.0.2 和 jersey 2.3.1。该示例注册了一个调用 sse 资源的静态资源。在 karaf 的日志中,您将看到与 servlet 容器相关的错误。
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2011-04-14
    • 2015-12-16
    • 2014-03-06
    • 2017-02-23
    • 1970-01-01
    • 2018-06-22
    • 2017-08-06
    相关资源
    最近更新 更多