0

我目前正在编写一个包含嵌入式码头的 Eclipse 产品。嵌入式码头正在封装一个眨眼应用程序。我通过将库包装为 Eclipse 插件并使用来自轨道内部版本号的 JAX RS 1.1.1 捆绑包,在 eclipse 产品中使用 wink 1.2.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 ) 在 org.apache.wink.server.internal.registry.ResourceRegistry.filterByProduces(ResourceRegistry.java:558) 在 org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptableMediaTypes(HttpHeadersImpl.java:106) 在 org. org.apache.wink.server.internal.registry.ResourceRegistry.findSubResourceMethod(ResourceRegistry.java:391) 在 org.apache.wink 的 apache.wink.server.internal.registry.ResourceRegistry.filterDispatchMethods(ResourceRegistry.java:482)。 server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:168) 在 org.apache.wink.server.internal.handlers。FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java: 22) 在 org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95) 在 org.apache. .wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain .doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.HeadMethodHandler。org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 的 handleRequest(HeadMethodHandler.java:53) org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:46) 在 org.apache.wink .server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain (AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink 的 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) .server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92) 在 org.apache.wink.server.handlers.RequestHandlersChain .handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) ) 在 org.apache.wink.server.handlers.RequestHandlersChain 的 org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)。org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 处的句柄(RequestHandlersChain.java:26) org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63)在 org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:48) 在 org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207) 在 org.apache.wink.server .internal.RequestProcessor.handleRequest(RequestProcessor.java:154) 在 org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:119) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java :790) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429) 在 org.eclipse.jetty.server 的 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) .handler.ContextHandler.doScope(ContextHandler.java:1020) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection .java:154) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 在 org.eclipse.jetty.server.Server.handle(Server.java:366) 在 org.eclipse。 jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) 在 org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971) 在 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)在 org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 在 org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 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) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) 的 parseNext(HttpParser.java:640) org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 的 org.eclipse .jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 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)org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) 的 parseNext(HttpParser.java:640) org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 的 org.eclipse .jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 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)SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java :53) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java :53) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 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 回退到默认球衣实现,因为类加载器无法从 META-INF 加载 JAX RS 类实现的名称/services/javax.ws.rs.ext.runtimeDeletage 文件位于我捆绑的 wink 通用 eclipse 插件中。

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

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

请考虑到我不能升级到 JAX RS 2.0 也不能使用不同的 JAX RS 实现,因为我使用的是依赖于 wink 的 OSLC4J。

4

1 回答 1

0

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

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

于 2017-03-13T17:10:57.423 回答