I'm having an issue getting a websocket deployed in SpringBoot. I've tried quite a few approaches based on https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support, Using Java API for WebSocket (JSR-356) with Spring Boot, etc with out any luck.
Here is what I'm trying:
web socket:
@ServerEndpoint(value="/socket/{name}", configurator = SpringConfigurator.class)
public class TestSocket {
public ApiSocket(){}
@OnOpen
public void onOpen(
Session session,
@PathParam("name") String name) throws IOException {
session.getBasicRemote().sendText("Hi " + name);
}
}
applications.properties:
server.contextPath=/api
Main class:
@SpringBootApplication
public class Main {
public static void main(String[] args) throws Exception {
SpringApplication.run(Main.class, args);
}
}
According to the blog post above, this should be all that's required. I've also tried the second approach described which involves a bean with no luck:
@Bean
public ServerEndpointExporter endpointExporter() {
return new ServerEndpointExporter();
}
I am trying to open a connection to ws://localhost:8080/api/socket/John and expecting to receive a response back with the path name:
var socket = new WebSocket('ws://localhost:8080/api/socket/John');
The result is a 404 during the handshake.
You have to add also the TestSocket in your Bean in Spring Configuration and remove
configurator = SpringConfigurator.class
from your TestSocket.Generally Spring overrides the normal java JSR 356 websocket by it's STOMP protocol which is part of websocket. It also not support fully binary message as normal websocket . You should add
ServerEndpointExporter
in Configuration as:Let's see the complete chatMessage with the room in which the client ge's connected as:
Note That, You should add ChatEndpointNew and ServerEndpointExporter separately of your main Spring configuration of your Application. If any bug appear try this:
You can also go through this Spring documentation.