I'm using Spring 3.2.5 without full new JSR-356 WebSockets support.
I would like to have singleton-bean reference in my @ServerEndpoint
WebSocket server, which is instantiated by servlet container itself, not in Spring context.
What is the clean way to do it?
My current solution: I made @Service
singleton bean with instance in static field:
@Service
public class WebSocketSupportBean {
private volatile static WebSocketSupportBean instance = null;
public static WebSocketSupportBean getInstance() {
return instance;
}
public WebSocketSupportBean() {
instance = this;
}
and just getting it in @ServerEndpoint
by static method, disconnecting user if null returned (if bean not jet created during server startup but user connects):
Try
And add maven dependency
try this,it works for me
I found this solution on https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support but there is one more glitch,the class annotated with @ServerEndpoint cant acquire httpsession with SpringConfigurator,there is no a override of method modifyhandler in it.Maybe we create a seperate Configurator extends SpringConfigurator and override that method would be a workaroud. It is better to build a real-time web application with spring-websocket and messaging api,I think.
You can make your @ServerEndpoint object extend SpringBeanAutowiringSupport. Then just make it aware of beans that gets constructed within a Spring-based web application this way:
This way @Autowired annotation will worl correctly:
You have to add bean definition in the configuration of spring.
The solution i found to integrate JSR 356 websocket
@ServerEndpoint
is to turn off the Servlet container's scan for WebSocket endpoints by spring which can be done by registering @Bean in your Spring Configuration. By this spring not overrides normal JSR 356 websocket by spring STOMP websocket which is the part of the websocket.Adding Beans in your Configuration as:
This all done for you. But you should remove
configurator = SpringConfigurator.class
from@ServerEndpoint
. I am using Spring Websocket 4.0.0 and it works fine. You can also see this Link.If you alright then follow this Link also for concept.
Note that, Normally you should make websocket configuration separately from the main configuration of your spring.
You can setup websockets with spring framework 3.x
I developed a small proof-of-concept application to demonstrate how, based on Rossen Stoyanchev's SpringConfiguration released with spring-core 4.0.
The application sets up a websocket server endpoint with uri
/wstest
which will use a@Autowired
spring bean to select a greeting word and reply to a websocket message.The websocket connection is initiated and messages sent by an html page (
index.html
) running in a browser that supports websockets.The Endpoint registration is made by a ServletContextListener at context initialization and when the endpoint is instantiated it will be wired with spring:
And the Endpoint is:
Checkout the full source and ready to run example on my Github page.