2016-09-28 68 views
0

我尝试在端点获取http会话。我遵循这个推荐https://stackoverflow.com/a/17994303。这就是为什么我做的事:Jetty,websocket,java.lang.RuntimeException:无法加载平台配置程序

public class MyConfigurator extends ServerEndpointConfig.Configurator 
{ 
    @Override 
    public void modifyHandshake(ServerEndpointConfig config, 
           HandshakeRequest request, 
           HandshakeResponse response) 
    { 
     HttpSession httpSession = (HttpSession)request.getHttpSession(); 
     config.getUserProperties().put(HttpSession.class.getName(),httpSession); 
    } 
} 

@ServerEndpoint(value = "/foo", configurator = MyConfigurator.class) 
public class MyEndpoint { 

    private Session wsSession; 

    private HttpSession httpSession; 


    @OnOpen 
    public void open(final Session session,EndpointConfig config) { 
     this.wsSession=session; 
     this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName()); 
    } 
} 

而这就是我得到

java.lang.RuntimeException: Cannot load platform configurator 
    at javax.websocket.server.ServerEndpointConfig$Configurator.fetchContainerDefaultConfigurator(ServerEndpointConfig.java:123) 
    at javax.websocket.server.ServerEndpointConfig$Configurator.getContainerDefaultConfigurator(ServerEndpointConfig.java:128) 
    at javax.websocket.server.ServerEndpointConfig$Configurator.checkOrigin(ServerEndpointConfig.java:192) 
    at org.eclipse.jetty.websocket.jsr356.server.JsrCreator.createWebSocket(JsrCreator.java:88) 
    at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:187) 
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:207) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) 
    at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:70) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) 
    at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:276) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 
    at org.eclipse.jetty.server.Server.handle(Server.java:524) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) 
    at java.lang.Thread.run(Thread.java:745) 

我用的OSGi,码头9.3.11和PAX-网络6.0.0。

+0

看起来像OSGi环境中的'ServiceLoader'问题。 'javax.websocket.server.ServerEndpointConfig'使用ServiceLoader来加载默认的配置器(来自Jetty) –

回答

4

问题是javax.websocket-api jar没有设置为在osgi中使用ServiceLoader机制,因此它可以找到自定义的Configurator实例。

为了在OSGi的工作,在javax.websocket-API JAR清单需要有这些行:

Require-Capability: osgi.serviceloader;filter:="(osgi.serviceloader=javax.websocket.server.ServerEndpointConfig.Configurator)";resolution:=optional;cardin 
ality:=multiple,osgi.extender;filter:="(osgi.extender=osgi.serviceloa 
der.processor)" 

所以,因为它不具备这些行,你要需要添加另一个带有这些行的清单的包,并将其自身声明为javax.websocket-api包的片段。

如果你正在使用maven,行你在POM需要的是这样的:

 <plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-bundle-plugin</artifactId> 
     <configuration> 
      <instructions> 
       <Bundle-SymbolicName>${bundle-symbolic-name};singleton:=true</Bundle-SymbolicName> 
       <Bundle-Name>OSGi Websocket API Fragment</Bundle-Name> 
       <Fragment-Host>javax.websocket-api</Fragment-Host> 
      <Require-Capability>osgi.serviceloader; filter:="(osgi.serviceloader=)javax.websocket.server.ServerEndpointConfig.Configurator";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)"</Require-Capability> 
      </instructions> 
     </configuration> 
     </plugin> 
+0

谢谢你的回答和时间。它没有帮助。我试图将这些行添加到javax.websocket-api的清单中。除此之外,我试图按照你的说法制作单独的包。它没有帮助。我有一种感觉,aries.spifly不适合我。也许除了添加三个包'asm-all-5.0.4.jar,org.apache.aries.util-1.1.1.jar,org.apache.aries.spifly.dynamic.bundle-1.0之外,我还需要做更多的事情。 1.jar'。 –

+0

你的回答几乎是正确的。错误在于配置器是嵌套类,所以不是最后一个'.'必须是'$'。所以我刚刚添加了'Require-Capability:osgi.extender; filter:=“(osgi.extender = osgi.servicelo ader.processor)”,osgi.serviceloader; filter:=“(osgi.serviceloader = javax。 websocket。 server.ServerEndpointConfig $ Configurator)“; resolution:= option al; cardinality:= multiple'来显示javax.websocket-api.jar –

0

这是创造我片段修复什么工作:

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-SymbolicName>${project.groupId}.${project.artifactId};singleton:=true</Bundle-SymbolicName> 
        <Bundle-Name>Websocket API OSGi Fix</Bundle-Name> 
        <Fragment-Host>javax.websocket-api</Fragment-Host> 
        <Require-Capability> 
         osgi.serviceloader;osgi.serviceloader="javax.websocket.server.ServerEndpointConfig$Configurator" 
        </Require-Capability> 
       </instructions> 
      </configuration> 
     </plugin> 
相关问题