Java Jersey、osgi和Servlet上下文3.x
我正在用Jersey 2.x和OSGI开发一个应用程序。 为了注册jersey(ServletContainer)的端点,我使用osgi的HTTPService和Jetty 8.x的实现 我想使用SSE(服务器发送事件),但不幸的是,当我使用实现它的服务时,它告诉我,这不会在Servlet上下文2.x中运行 奇怪的是,我使用的堆栈是Servlet3.x。 如果我使用SSE支持制作一个简单的servlet,那么不管JAX-RS如何,它都会运行良好。 我认为Jersey开始考虑在servlet容器2.x上运行,但没有考虑如何更改它。 我没有任何web.xml,因为它是一个本机应用程序OSGI 这是OSGI的简单初始化:Java Jersey、osgi和Servlet上下文3.x,java,servlets,jersey,osgi,Java,Servlets,Jersey,Osgi,我正在用Jersey 2.x和OSGI开发一个应用程序。 为了注册jersey(ServletContainer)的端点,我使用osgi的HTTPService和Jetty 8.x的实现 我想使用SSE(服务器发送事件),但不幸的是,当我使用实现它的服务时,它告诉我,这不会在Servlet上下文2.x中运行 奇怪的是,我使用的堆栈是Servlet3.x。 如果我使用SSE支持制作一个简单的servlet,那么不管JAX-RS如何,它都会运行良好。 我认为Jersey开始考虑在servlet容器2
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的配置 我认为我们可能有更好的解决方案,而不是直接使用HttpService,您可以使用白板扩展器(只需要为此安装http白板功能)。通过这种方式,您将Servlet注册为服务,白板扩展器将获取此信息,另请参见以下示例之一。或者,在开发Servlet3.0Servlet时,只需通过注释Servlet来注册它。您只需将web contextPath添加到捆绑包的清单中。关于这一点,请参见我的文章
如果这仍然没有帮助,我可能需要一个工作样本发送到ops4j邮件列表,或者向pax web添加一个问题,以便我可以更深入地了解它。顺便说一句,CXF确实使用白板方法,工作起来很有魅力;) 错误在于jersey模块与注册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级开始堆叠jersey,在80级开始应用,一切正常!!!!重要的模块是jersey core server,它增加了对Servlet3.x的支持
[ 168] [ Active] [ 80] OsgiJersey OSGi Bundle (1.0.0.SNAPSHOT)
请参阅中的示例,是什么让您认为您正在Servlet 3.0堆栈中运行?项目依赖项是Servlet 3.x。我还有一个servlet异步,它工作得很好。但是JAX就像运行在2.XI上编辑原始的POST一样,在那里会看到异常和一些依赖关系。项目依赖性可能意味着构建依赖关系,对吧?但是它们是不相关的,因为错误发生在运行时,而不是构建时。因为它是使用PaxWeb3.0.2运行的,所以Servlet3.0是可用的。可能想在ops4j邮件列表中提问,或者提供一个示例。我更改了代码,并使用WebContainer注册了一个servlet(Jersey的ServletContainer)。但是错误是找不到的!!!在浏览器中尝试访问jax资源时。如果我将webContainer更改为httpService,则访问资源时不会出错。但是,对于httpService,错误在于我使用SSE时,正如帖子中所解释的。因为我以前从未使用过Jersey,如果你能提供一个小样本,让我自己尝试一下,那真的太好了,请在ops4j邮件列表中提供,否则我将无法进一步帮助…@AchumNierbeck我将制作一个小示例,然后上传。我发现HTTPService和WebContainer类之间记录路由的方式有所不同<代码>1)httpservice.RegistreServlet(“/rest/”,…)2)webcontainer.RegistreServlet(servlet,“名称”,新字符串[]{“/rest/*”}…1)仅“/rest”2)如果不添加/*未找到任何资源。但问题是,我认为Jersey并没有发现在Servlet3.x容器中运行。任何其他servlet都可以与WebContainer类完美地运行。我将上传一个带有代码的示例。谢谢。这就是为什么我需要一个示例来调试,并检查PaxWeb是否需要“提供”一些东西来告诉Servlet的版本:-)@AchumNierbeck这是我的存储库(OsgiJersey)中的一个示例的一个例子。我使用PaxWeb3.0.2和jersey 2.3.1。该示例注册一个调用sse资源的静态资源。在karaf的日志中,您将看到与servlet容器相关的错误。