L'accès SessionScoped objet EJB stateless
J'ai un SessionScoped classe. Pour chaque accès de l'utilisateur-je besoin d'une instance de cette classe. Tout s'est bien passé pendant une longue période.
Mais maintenant, j'ai aussi besoin d'accéder à cet objet depuis le backend sans aucune interaction de l'utilisateur.
J'ai un apatride enterprise bean, mais chaque fois que je veux accéder à la session de l'étendue de l'objet-je obtenir une excepiton.
Un exemple simple de code est comme suit:
@SessionScoped
public class SessionObj implements Serializable {
public String getValue() {
return "Hello World";
}
}
@Stateless
public class StatelessBean {
private static final Logger LOG=Logger.getLogger(StatelessBean.class);
@Inject
private SessionObj sessionObj;
public void test() {
LOG.info("session object: "+sessionObj);
LOG.info("Method call: "+sessionObj.getValue());
}
}
Mais l'appel de la méthode d'essai se termine dans une exception comme:
12:19:10,484 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (EJB default - 6) javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
12:19:10,484 ERROR [org.jboss.ejb3.invocation] (EJB default - 6) JBAS014134: EJB Invocation failed on component StatelessBean for method public void package.StatelessBean.test(): javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:139) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:204) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:306) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
...
Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:598) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:71) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at package.SessionObj$Proxy$_$$_WeldClientProxy.toString(SessionObj$Proxy$_$$_WeldClientProxy.java) [ws_core_job_manager.jar:]
at java.lang.String.valueOf(String.java:2826) [rt.jar:1.6.0_21]
at java.lang.StringBuilder.append(StringBuilder.java:115) [rt.jar:1.6.0_21]
at package.StatelessBean.test(StatelessBean.java:29) [ws_core_job_manager.jar:]
...
Donc ma question est:
* Est-il une option pour accéder à l'objet même sans une session par un truc?
* Est-il une option pour générer une session à partir de l'intérieur de mon apatrides de classe?
Je comprends la cause de l'exception, mais je veux avoir un 'global' session pour cette nouvelle utilisation du code existant. Dans reallity bien sûr, il n'est pas si facile et la modification de la session d'étendue de code pour un POJO et une session d'étendue de conteneur n'est pas si facile.
Environnement:
- JDK 1.6
- JBOSS 7.1.1
Solution:
Comme mentionné par Jan:
Étendre la StatelessBean comme suit:
@Stateless
public class StatelessBean {
private static final Logger LOG=Logger.getLogger(StatelessBean.class);
@Inject
private BoundSessionContext sessionContext;
@Inject
private SessionObj sessionObj;
public void test() {
Map<String,Object> myMap=new HashMap<String,Object>();
sessionContext.associate(myMap);
sessionContext.activate();
LOG.info("session object: "+sessionObj);
LOG.info("Method call: "+sessionObj.getValue());
sessionContext.invalidate();
sessionContext.deactivate();
}
}
Et que l'exemple est le travail!
Maintenant, j'ai juste besoin de comprendre les détails 😉
SessionObj
sera perdu (devenu inaccessible) lors de l'appel à test
finitions, droit? Vous aurez une nouvelle instance à chaque fois. Est-ce que vous voulez?il n'y a pas de problème avec la solution parce que la référence à
SessionObj
est mandaté,
OriginalL'auteur Martin Metz | 2012-07-17
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas d'accès à une session d'étendue de bean lui-même, le problème est que le session n'est pas active, probablement parce qu'il n'a jamais été lancé (par exemple, EJB remoting).
Ce que vous pouvez faire est de commencer une
BoundSessionContext
manuellement, avoir un regard ici. Je l'ai fait pour les conversations, et il a bien fonctionné.OriginalL'auteur jan groth
vous ne pouvez pas accéder à la session ou de stocker quelque chose avec stateless, c'est pourquoi ils sont appelés apatrides! La seule chose que vous pouvez accéder est EjbContext, à partir d'elle, vous pouvez obtenir de l'appelant directeurs d'école et credencials, mais n'oubliez pas de configurer le module de connexion de la première.
OriginalL'auteur Raman