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.classfrom 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
ServerEndpointExporterin 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.