spring - the - Uso de un bean de ámbito de solicitud fuera de una solicitud web real
what is the default nature of the beans defined in spring framework? (3)
Tengo una aplicación web que tiene una lógica de integración Spring ejecutándose con ella en un hilo separado. El problema es que, en algún momento, mi lógica de integración de Spring intenta usar un bean de ámbito de solicitud y luego obtengo los siguientes errores:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''scopedTarget.tenantContext'': Scope ''request'' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
Tengo el conjunto ContextLoaderListener:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Mi Scoped Bean está anotado así (ya que escuché que ayudarme con el bean sería útil):
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TenantContext implements Serializable {
¿Es posible lo que estoy haciendo? Si es así, ¿qué me estoy perdiendo aquí? Si no, ¿alguna otra sugerencia sobre cómo puedo lograr eso?
Para Spring 4 Frameworks, agregue servletContext.addListener (new RequestContextListener ());
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfiguration.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfiguration.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter() };
}
**@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new RequestContextListener());
}**
}
Solo puede usar beans de solicitud (y de sesión) en el subproceso del contenedor web en el que se ejecuta la solicitud.
¿Supongo que el hilo está esperando una respuesta asíncrona de su flujo SI?
Si es así, puede enlazar el bean con ámbito de solicitud al mensaje, quizás en un encabezado, o en algún lugar de la carga útil.
Use RequestContextFilter con la propiedad threadContextInheritable set a true. Esto hace que el subproceso secundario herede el contexto principal, que contiene el objeto de solicitud en sí. También asegúrese de que el ejecutor no reutilice los subprocesos en el grupo, ya que el objeto de solicitud es muy específico para esa solicitud y no se puede compartir entre varias solicitudes. Uno de estos ejecutores es SimpleAsyncTaskExecutor.
Para obtener más información, consulte Ámbito ''sesión'' no está activa para el hilo actual; IllegalStateException: no se ha encontrado ninguna solicitud vinculada a un hilo .