Cómo usar un bean de ámbito de solicitud en una llamada asincrónica del marco de trabajo Reactor?
No se puede usar un bean de ámbito de solicitud en un código de Reactor. Se enfrenta a la siguiente excepción:
org.springframework.beans.factory.BeanCreationException:
Error al crear el bean con nombre 'scopedTarget.eventProcessor': El ámbito 'request' no está activo para el hilo actual; considere definir un proxy de ámbito para este bean si pretende hacer referencia a él desde un singleton;
La excepción anidada es java.lang.IllegalStateException
:
No se encontró ninguna solicitud vinculada al hilo: ¿Se refiere a atributos de solicitud fuera de una solicitud web real o procesando una solicitud fuera del hilo que la recibió originalmente?
Si está operando dentro de una solicitud web y aún recibe este mensaje, es probable que su código se esté ejecutando fuera de DispatcherServlet: En este caso, use RequestContextListener o RequestContextFilter para exponer la solicitud actual.
davy.ai
Descripción del problema:
Según el mensaje de error, parece que hay un problema al usar un bean con ámbito de solicitud en un código de Reactor. El mensaje de error sugiere que el ámbito ‘request’ no está activo para el hilo actual. También sugiere definir un proxy con ámbito para este bean si tienes la intención de referirte a él desde un singleton. La excepción anidada está lanzando un IllegalStateException que indica “No se encontró ninguna solicitud asociada al hilo”.
El mensaje explica además que si el código se está ejecutando fuera de DispatcherServlet, se puede utilizar RequestContextListener o RequestContextFilter para exponer la solicitud actual.
Solución:
Para resolver este problema, debemos asegurarnos de que el ámbito esté activo para el hilo actual. Una forma de lograr esto es mediante la definición de un proxy con ámbito para este bean. El proxy con ámbito asegura que el bean se instancie cuando sea necesario y se cree una nueva instancia para cada solicitud. Esto se puede lograr anotando el bean con “@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)”.
Por ejemplo:
Otra solución es utilizar RequestContextListener o RequestContextFilter para exponer la solicitud actual si el código se está ejecutando fuera de DispatcherServlet. Estas clases permiten acceder a la solicitud actual dentro de una solicitud web.
Por ejemplo:
Al utilizar cualquiera de las soluciones anteriores, podemos asegurarnos de que el bean con ámbito de solicitud funcione correctamente en nuestro código de Reactor.