2016-09-28 5 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 и чел-веб 6.0.0.

+0

выглядит как 'ServiceLoader' в вашей среде OSGi. 'Javax.websocket.server.ServerEndpointConfig' использует ServiceLoader для загрузки Конфигуратора по умолчанию (от Jetty) –

ответ

4

Проблема заключается в том, что javax.websocket-api jar не настроен для использования механизма ServiceLoader в osgi, поэтому он может найти пользовательские экземпляры Configurator.

Для того, чтобы работать в OSGi, манифест в javax.websocket-апи банку нужно будет иметь следующие строки:

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, строки, которые вы должны были бы в ПОМ что-то вроде:

 <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

Ваш ответ почти прав. Ошибка заключается в том, что Configurator - это вложенный класс, поэтому вместо последнего '.' должен быть' $ '. Поэтому я просто добавил 'Требование-Способность: osgi.extender; filter: =" (osgi.extender = osgi.servicelo ader.processor) ", osgi.serviceloader; filter: =" (osgi.serviceloader = javax. websocket. server.ServerEndpointConfig $ Configurator) "; разрешение: = опция al; мощность: = 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^