7
votes

Printemps: Bean Inject dépend du contexte (session / Web ou processus de filetage / arrière-plan local)

est-il possible de créer une usine ou un proxy pouvant décider si le thread est exécuté dans la requête (Web) ou le processus d'arrière-plan (c.-à-d. Planificateur), puis en fonction de cette information, il crée un haricot de session ou un haricot prototype?

Exemple (Pseudo Spring Config :) P>

        clientSessionEmulator.startEmulateUser( testUser );
        try {
            service.doSomething();
        } finally {
            clientSessionEmulator.stopEmulation();
        }


0 commentaires

3 Réponses :


2
votes

Votre rephrase est en effet considérablement plus simple :)

Votre CurrentUserInfofactory pourrait utiliser demandecontextholder.getrequestattributes () . Si une session est présente et associée au thread d'appel, cela retournera un objet non nul, et vous pouvez ensuite récupérer en toute sécurité la graine de session sur le contexte. Si cela renvoie une null, vous devriez plutôt récupérer le haricot prototype.

Ce n'est pas très soigné, mais c'est simple et devrait travailler.


2 commentaires

Je vais essayer. Parfois, la solution la plus simple est la meilleure et si cela fonctionne, pourquoi n'est-ce pas soigné? Quelques autres solutions?


@Frank: code qui utilise requiercontextholder est généralement difficile à tester. Pour cette raison, il devrait être découragé.



1
votes

Créer deux chargeuses de contexte personnalisées qui lient la même défiance de la même portée à différentes implémentations: xxx

puis vous faites un correspondant pour singleton (faites votre propre portée avec juste statique)

Ensuite, vous spécifiez simplement le chargeur de contexte approprié dans le démarrage XML pour chacun des deux contextes.


1 commentaires

Où dois-je spécifier le chargeur de contexte approprié dans WebContext? Je n'ai pas vraiment le point sur la portée personnalisée, désolé. J'ai trouvé votre conversion ici ici Stackoverflow.com/questions/450557/custom-spring-copes mais il n'a pas fait ' t me procurer le point de ...



3
votes

J'ai créé une petite solution de contournement universelle pour injecter des haricots dépend du contexte.

suppose que nous avons deux haricots: p> xxx pré>

Nous voulons utiliser "userinfo" haricot pour l'utilisateur Web actions et haricotement "userinfosessessless" pour les services de fond, par exemple. Wa également vouloir écrire du code et ne veut pas penser au contexte, par exemple: p> xxx pré>

Nous avons besoin de créer une scène de session personnalisée pour le faire fonctionner: P> XXX PRE>

Enregistrer Nouvelle portée: P>

<bean class="xyz.UserInfo" id="userInfo" scope="mySession" autowire-candidate="true"/>
<bean class="xyz.UserInfo" id="userInfoSessionLess" autowire-candidate="false"/>


1 commentaires

N'a pas encore essayé votre solution mais cela me semble très mignon. Merci de le partager!