It seems that you are trying to integrate Spring and Java WebSocket API. A class annotated by @Component
is registered to a spring bean and its instance is managed by spring as a singleton by default. However, a class annotated by @ServerEndpoint
is registered to a server-side WebSocket endpoint and every time the corresponding endpoint's WebSocket is connected to the server, its instance is created and managed by JWA implementation. Therefore, you can't use both annotations together.
Maybe the simplest workaround is to use CDI instead of Spring. Of course, your server should support CDI.
@ServerEndpoint("/ws")
public class MyWebSocket {
@Inject
private ObjectMapper objectMapper;
}
If it's not feasible to you, you can intercept instantiation process of the class annotated with ServerEndpoint
by using a your own version of ServerEndpointConfig.Configurator. Then, you can instantiate the class by yourself and autowire it using an instance of BeanFactory
or ApplicationContext
. Actually, there is already similar answer to this usage. See that question and Martins' working example (Especially, a customized Configurator for integration with Spring).