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 😉

Avec votre solution, l'instance de 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