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.

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.
Tags:  , , , ,

Answer

  1. Avatar for 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:

    @Component
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class MyRequestScopedBean { ... }
    

    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:

    @WebListener
    public class MyRequestContextListener extends RequestContextListener { ... }
    
    @WebFilter
    public class MyRequestContextFilter extends RequestContextFilter { ... }
    

    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.

Comments are closed.