4

SessionScopedクラスがあります。ユーザーアクセスごとに、このクラスの独自のインスタンスが必要です。すべてが長い間うまくいきました。ただし、ユーザーの操作なしで、バックエンドからこのオブジェクトにアクセスする必要もあります。私はステートレスエンタープライズBeanを持っていますが、セッションスコープのオブジェクトにアクセスしたいときはいつでも例外を取得します。簡単なサンプルコードは次のとおりです。

@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());
    }

}

ただし、testメソッドの呼び出しは、次のような例外で終了します。

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:]
    ...

だから私の質問は:*どんなトリックでもセッションがなくてもオブジェクトにアクセスするオプションはありますか?*ステートレスクラス内から1つのセッションを生成するオプションはありますか?

例外の原因は理解していますが、既存のコードのこの新しい使用法のために1つの「グローバル」セッションが必要です。もちろん、実際にはそれほど簡単ではなく、セッションスコープのコードをPOJOに変更し、セッションスコープのコンテナーを変更するのはそれほど簡単ではありません。

環境:

  • JDK 1.6
  • JBOSS 7.1.1

解決:

Janが述べたように:StatelessBeanを次のように拡張します。

@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();
    }

}

そして、例は機能しています!今、私は詳細を理解する必要があります;-)

4

2 に答える 2

5

問題は、セッションスコープのBean自体にアクセスしないことです。問題は、セッションがアクティブになっていないことです。おそらく、セッションが開始されたことがないためです(EJBリモーティングなど)。

あなたができることはBoundSessionContext手動で始めることです、ここを見てください。私は会話のためにそれをしました、そしてそれはうまくいきました。

于 2012-07-18T04:11:15.630 に答える
-3

セッションにアクセスしたり、ステートレスBeanを使用してセッションに何かを保存したりすることはできません。そのため、セッションはステートレスと呼ばれます。アクセスできるのはEjbContextだけです。これから、呼び出し元のプリンシパルとクレデンシャルを取得できますが、最初にログインモジュールを構成することを忘れないでください。

于 2012-07-17T12:24:41.270 に答える