No 'javax.websocket.server.ServerContainer' ServletContext attribute - Glassfish 4.1

自作多情 提交于 2019-12-06 09:03:53

问题


I'm using Glassfish 4.1 to deploy my WAR application. Cannot connect to websocket, getting this message from glassfish:

My websocket configuration

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(socketHandler(),"/socket");;
    }

    @Bean
    public WebSocketHandler socketHandler() {
        return new WebSocketEndpoint();
    }


}

WebSocket Handler

public class WebSocketEndpoint extends TextWebSocketHandler {

    @Autowired
    private TestService testService;

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        System.out.println("Testing "+message.getPayload());
        try {
            session.sendMessage(new TextMessage(testService.getWelcomeMessage()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

And I got a bean in my dispatcher-servlet

<bean class="pl.iaserver.websocket.WebSocketConfig"/>

The error:

ava.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getContainer(AbstractStandardUpgradeStrategy.java:68)
    at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getSupportedExtensions(AbstractStandardUpgradeStrategy.java:88)
    at org.springframework.web.socket.server.support.DefaultHandshakeHandler.doHandshake(DefaultHandshakeHandler.java:209)
    at org.springframework.web.socket.server.support.WebSocketHttpRequestHandler.handleRequest(WebSocketHttpRequestHandler.java:128)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:745)
]]

回答1:


You should have Glassfish Tyrus of 1.8 version only. Put it in the modules folder of GlassFish (glassfish/modules).

  • tyrus-core-1.8.jar
  • tyrus-client-1.8.jar
  • tyrus-container-glassfish-cdi-1.8.jar
  • tyrus-container-glassfish-ejb-1.8.jar
  • tyrus-container-grizzly-client-1.8.jar
  • tyrus-container-servlet-1.8.jar
  • tyrus-server-1.8.jar
  • tyrus-spi-1.8.jar

You can find them on the http://mvnrepository.com/artifact/org.glassfish.tyrus.

The reason for this is because Spring WebSocket version 4.2.1 (I have this version) depends on GlassFish Tyrus version 1.8.

Be sure to put these files in the modules folder (glassfish/modules) instead of the files tyrus lying there, otherwise Default Tyrus will be loaded.




回答2:


Probably you need to add the javax.websocket dependency.

Maven:

   <dependency>
     <groupId>javax.websocket</groupId>
     <artifactId>javax.websocket-api</artifactId>
     <scope>provided</scope>
     <version>1.1</version>
   </dependency>

Gradle:

'javax.websocket:javax.websocket-api:1.1'

See: https://tyrus.java.net/dependencies.html




回答3:


What I found to work was including the following dependencies in your POM file (I originally got the information from here):

<!-- add the dependency for JSR 356 API -->
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
</dependency>

<!-- add Tyrus JSR 356 implementation related dependencies -->
<dependency>
    <groupId>org.glassfish.tyrus</groupId>
    <artifactId>tyrus-server</artifactId>
    <version>1.12</version>
</dependency>
<dependency>
    <groupId>org.glassfish.tyrus</groupId>
    <artifactId>tyrus-client</artifactId>
    <version>1.12</version>
</dependency>

<!-- add the tyrus-container-grizzly dependency to our pom.xml. 
This will provide a standalone container to deploy WebSocket
applications -->
<dependency>
    <groupId>org.glassfish.tyrus</groupId>
    <artifactId>tyrus-container-grizzly</artifactId>
    <version>1.2.1</version>
</dependency>



回答4:


I faced the same issue recently while running my spring-boot application in tomcat 9 (> version 9.0.8). It is a regression introduced in the latest version of tomcat : https://github.com/spring-projects/spring-boot/issues/15746



来源:https://stackoverflow.com/questions/32074948/no-javax-websocket-server-servercontainer-servletcontext-attribute-glassfish

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!