2016-04-13 2 views
0

j'ai simple POJO UserQuota avec 1 champ quota en elle:pourquoi mon bean session scoped session de printemps est partagée entre les sessions?

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public interface UserQuota { 
    public int getQuota(); 
    public void setQuota(int quota); 
} 

maintenant, j'ai utilisé deux fenêtres de navigateur différentes (Firefox et Chrome) pour se connecter à mon application Web que deux utilisateurs différents. à ma grande surprise, quand je fixe la valeur de quota (avec setQuota) d'une session, la nouvelle valeur devient disponible pour l'autre session (quand getQuota est appelée). je m'attendais à ce que chaque session d'utilisateur ait sa propre instance de bean; N'est-ce pas ce que la session est la fève au printemps?

Il me manque quelque chose. Qu'est ce que ça pourrait être?

modifier:

la classe de mise en œuvre ressemble à ceci:

@Component 
public class UserQuotaImpl implements UserQuota { 

    private int quota; 

    /** 
    * @return the quota 
    */ 
    public int getQuota() { 
     return quota; 
    } 

    /** 
    * @param quota the quota to set 
    */ 
    public void setQuota(int quota) { 
     this.quota = quota; 
    } 

} 

et enfin voici comment j'utiliser la fève de session:

@Component 
public class UserQuotaHandler { 

    @Autowired 
    private UserQuota userQuota; 

    public void checkAndUpdateQuota() { 
     int quota = userQuota.getQuota(); 

     // i use my business logic to decide whether the quota needs an update 
     if(myBusinessLogic) { 
      userQuota.setQuota(someNewValue); 
     } 
    } 

} 

J'utilise context:component-scan dans ma config xml fichier. on peut noter que la plupart de mes autres haricots autowired sont des haricots singleton qui semblent avoir fonctionné comme prévu

+0

Veuillez montrer comment vous injectez et utilisez le grain. – Savior

+0

J'ai mis à jour ma question comme demandé – Tanvir

+0

Où est la classe d'implémentation? Vous aurez envie d'annoter cela avec le '@ Scope', pas l'interface, afaik. – Savior

Répondre

2

Vous aurez besoin d'annoter votre classe de haricots concrets avec la session @Scope, UserQuotaImpl dans votre cas.

Spring ignore le @Scope sur toutes les superclasses ou superinterfaces de votre classe de béton. Et puisque votre type n'a pas de @Scope explicites annotations

@Component 
public class UserQuotaImpl implements UserQuota { 

Spring suppose que vous censé faire un haricot singleton.

+0

cela signifie que ma demande de haricots tronqués ont le même problème, aussi! c'est juste que le problème avec le bean tronqué de session est venu à la surface d'abord – Tanvir

+1

@Tanvir En général, ne supposez pas que les annotations sont jamais "héritées". – Savior