es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la anotación @Autowired que no funciona correctamente en la clase MessageWsHandler. Esto puede ocurrir porque el bean MessageWsHandler podría crearse antes que el bean MessageService, lo que resultaría en que la propiedad messageService sea nula.

    Para solucionar este problema, puedes intentar agregar la anotación @DependsOn a la clase MessageWsHandler, de esta manera:

    @Component
    @DependsOn("messageService")
    public class MessageWsHandler implements WebSocketHandler {
        @Autowired
        MessageService messageService;
    
        // Código adicional
    }
    

    Esto asegurará que el bean MessageWsHandler se cree solo después de que se haya creado el bean MessageService.

    Como alternativa, puedes intentar agregar la anotación @Lazy a la clase MessageService, de esta manera:

    @Service
    @Lazy
    public class MessageService {
        // Código del servicio
    }
    

    Esto retrasará la creación del bean MessageService hasta que realmente sea necesario, lo que garantizará que se cree antes del bean MessageWsHandler.

    Espero que una de estas soluciones funcione para ti y puedas crear con éxito un cliente WebSocket en Spring Boot.

Comments are closed.