不能在 Eclipse 产品中使用 Wink 1.2.1 作为 JAX RS 实现



我目前正在编写一个Eclipse产品,包括一个嵌入式码头。嵌入式码头正在封装一个眨眼应用程序。我正在使用 wink 1.2.1 在 eclipse 产品中孵化,方法是将库包装为 Eclipse 插件并使用轨道内部版本号中的 JAX RS 1.1.1 捆绑包:R20151221205849。

最初,我在运行 Eclipse 产品时遇到以下异常:

java.lang.NullPointerException at org.apache.wink.common.internal.http.Accept.valueOf(Accept.java:139) at org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptHeader(HttpHeadersImpl.java:152) at org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptableMediaTypes(HttpHeadersImpl.java:106) at org.apache.wink.server.internal.registry.ResourceRegistry.filterByProduces(ResourceRegistry.java:558) at org.apache.wink.server.internal.registry.ResourceRegistry.filterDispatchMethods(ResourceRegistry.java:482) at org.apache.wink.server.internal.registry.ResourceRegistry.findSubResourceMethod(ResourceRegistry.java:391) at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:168) at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:46) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:48) at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207) at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154) at org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:119) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:366) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)

这个答案:https://stackoverflow.com/a/20402681/5907194 表明原因是另一个jax rs实现与wink的冲突。

事实上,在调查了 JAX RS 中的 FactoryFinder.find(String factoryId, String fallbackClassName) 之后,事实证明 JAX RS 回退到默认的 jersey 实现,因为类加载器无法从 META-INF/services/javax.ws.rs.ext.runtimeDeletage 文件中加载 JAX RS 类实现的名称,该文件位于 wink common eclipse 插件 i 捆绑中。

我怀疑这是 osgi 类加载的问题,因为 JAX RS 插件的类加载器无法看到 JAX RS 不依赖的插件中的资源。因此,我将机器上 JAX RS 插件的 Eclipse 好友策略 (http://www.wickedshell.net/blog/2010/01/fragments-vs-buddy-classloading/) 更改为"Eclipse-BuddyPolicy: register",并使用 "Eclipse-RegisterBuddy: javax.Ws.rs 向 JAX RS 注册了 Wink 通用插件。 要求捆绑包:javax.Ws.rs" .

现在可以避免异常,并且可以正确运行产品。现在我的问题是:是否需要更改轨道上的 JAX RS 插件才能与其他 JAX RS 实现(例如 wink)一起使用,或者我缺少其他选项?

请注意,我不能升级到 JAX RS 2.0,也不能使用不同的 JAX RS 实现,因为我使用的是依赖于眨眼的 OSLC4J。

Eclipse-BuddyPolicy的问题在于它特定于春分。另一个挑战是Java的服务查找器。默认情况下,它在 OSGi 环境中无法正常工作。您可以尝试使用 JAX-RS 捆绑包的片段。将Apache SPI Fly添加到堆栈中可能会更幸运。但是,这需要向服务提供商和使用者提供额外的标头。我已将Apache SPI Fly Bundles添加到EBR。

根据您的特定需求/堆栈,听起来您可能更幸运地自己创建 JAX-RS 捆绑包。查看 EBR 以根据需要创建自定义捆绑包。Eclipse Orbit 中的那个是专门为使用它的 Eclipse 项目中的用例创建的。它可能无法满足Wink和您的产品的特定需求。

最新更新