Utilisation d'un bean de portée de requête en dehors d'une requête Web réelle
J'ai une application web qui a un Ressort de la logique d'Intégration en cours d'exécution avec elle dans un thread séparé. Le problème est qu'à un certain point de mon Ressort une logique d'Intégration essaie d'utiliser une portée de la requête bean et j'obtiens les erreurs suivantes:
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.
J'ai le ContextLoaderListener ensemble:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Ma Portée Bean est annoté comme ça(depuis que j'ai entendu dire que proxing mon haricot aiderait):
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TenantContext implements Serializable {
Est ce que je fais possible?
Si oui, ce qui me manque ici?
Si non, d'autres suggestions sur comment je peux réaliser cela?
source d'informationauteur Diego Urenia
Vous devez vous connecter pour publier un commentaire.
Vous pouvez uniquement utiliser la demande (et de la session) étendue de haricots sur le conteneur web thread sur lequel la demande est en cours d'exécution.
Je présume que le thread est en attente pour un async réponse de votre SI?
Si oui, vous pouvez lier la demande d'étendue de haricot pour le message, peut-être dans un en-tête, ou quelque part dans la charge utile.
Pour le Printemps 4 Cadres ajouter servletContext.addListener(nouveau RequestContextListener());
Utilisation RequestContextFilter avec la propriété threadContextInheritable définie sur true. Cela rend l'enfant thread pour hériter le contexte du parent, qui contient l'objet de la requête elle-même. Assurez-vous également que l'exécuteur ne pas réutiliser les fils dans la piscine, parce que l'objet de demande est très spécifique à cette demande et ne peuvent pas être partagés entre les différentes demandes. L'un de ces exécuteur testamentaire est SimpleAsyncTaskExecutor.
Pour plus d'informations, reportez-vous Champ d'application "session" n'est pas active pour le thread en cours; l'exception IllegalStateException: Pas de fil lié demande trouvés.