2016-09-28 65 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> 
相關問題