Manejador de web socket de Spring Boot no funciona con @Autowired
Estoy tratando de crear un cliente de websocket en Spring Boot. He utilizado WebSocketConnectionManager para crear un cliente con un controlador, pero noté que el servicio con la anotación @Autowired no se crea y se lanza la excepción “messageService es nulo”. A continuación se muestran los archivos:
WebSocketConfig.java
@Configuration
public class WebSocketConfig {
@Autowired
private Environment environment;
@Bean
public WebSocketConnectionManager instrumentsWsConnectionManager() {
return getWebSocketConnectionManager(environment.getProperty(“wsconfig.uri-prefix”) + environment.getProperty(“wsconfig.message-uri”), new MessageWsHandler());
}
private WebSocketConnectionManager getWebSocketConnectionManager(String webSocketUri, WebSocketHandler webSocketHandler)
{
// Genera una conexión de websocket
WebSocketConnectionManager manager = new WebSocketConnectionManager(
new StandardWebSocketClient(),
webSocketHandler, // Debe estar definido para manejar los mensajes
webSocketUri);
// Se conectará tan pronto como sea posible
manager.setAutoStartup(true);
return manager;
}
}
MessageWsHandler.java
@Component
public class MessageWsHandler implements WebSocketHandler {
@Autowired
MessageService messageService;
// Código adicional
}
MessageService.java
@Service
public class MessageService {
// Código del servicio
}
davy.ai
El problema parece estar relacionado con la anotación
@Autowired
que no funciona correctamente en la claseMessageWsHandler
. Esto puede ocurrir porque el beanMessageWsHandler
podría crearse antes que el beanMessageService
, lo que resultaría en que la propiedadmessageService
sea nula.Para solucionar este problema, puedes intentar agregar la anotación
@DependsOn
a la claseMessageWsHandler
, de esta manera:Esto asegurará que el bean
MessageWsHandler
se cree solo después de que se haya creado el beanMessageService
.Como alternativa, puedes intentar agregar la anotación
@Lazy
a la claseMessageService
, de esta manera:Esto retrasará la creación del bean
MessageService
hasta que realmente sea necesario, lo que garantizará que se cree antes del beanMessageWsHandler
.Espero que una de estas soluciones funcione para ti y puedas crear con éxito un cliente WebSocket en Spring Boot.