2

私は現在使用しています:

  1. アパッチトムキャット7
  2. JBoss Weld サーブレット 1.0.1-Final
  3. 空のbeans.xml
  4. <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>web.xml で

私は現在、単純なカウンター @ConversationScoped Bean をテストしています。意図は、会話スコープを開始した後、ボタンがクリックされるたびにカウンターをインクリメントし続けることです..

しかし、送信後、最初に会話を開始した後でも、Bean は常に再作成されるようです。

ここに私の単純な豆があります:

package user.ui;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ConversationScoped
public class CounterBean implements Serializable {
    @Inject
    private Conversation conversation;

    @PostConstruct
    public void init() {
        System.out.println("beginning conversation : " + this.conversation);
        this.conversation.begin();
    }

    private int counter;

    public int getCounter() {
        return counter;
    }

    public void setCounter(int counter) {
        this.counter = counter;
    }

    public void increment() {
        this.counter++;
    }
}

これが私の単純なjsfビューです:

<ui:composition template="/template/masterlayout.xhtml">
    <ui:define name="windowTitle">Test Conversation Scope</ui:define>
    <ui:define name="heading">Test Conversation Scope</ui:define>
    <ui:define name="content">
        <h:form>
            <p:messages id="messages" globalOnly="true" />
            <p:panel header="Test Conversation Scope">
                <h:outputText value="counter : " /> #{counterBean.counter}
            </p:panel>

            <h:commandButton value="Submit Data to Server" action="#{counterBean.increment}" />
        </h:form>
    </ui:define>
</ui:composition>

最初のアクセスのログ ファイルは次のとおりです。

INFO: Server startup in 12055 ms
beginning conversation : ID: 1, transient: true, timeout: 600000ms

ビューが表示された後、ボタンをクリックすると、 catalina.out のこのログで例外がスローされます。

beginning conversation : ID: 2, transient: true, timeout: 600000ms
unhandled exception : org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type @ConversationScoped
cause exception : org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type @ConversationScoped, cause exception is BE : false

tomcat ログからの例外トレースは次のとおりです。

Apr 4, 2011 3:56:27 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/primebert] threw exception [WELD-001303 No active contexts for scope type @ConversationScoped] with root cause
org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type @ConversationScoped
    at org.jboss.weld.conversation.ConversationImpl.checkConversationActive(ConversationImpl.java:79)
    at org.jboss.weld.conversation.ConversationImpl.isTransient(ConversationImpl.java:234)
    at org.jboss.weld.conversation.ConversationImpl.toString(ConversationImpl.java:199)
    at java.text.MessageFormat.subformat(MessageFormat.java:1246)
    at java.text.MessageFormat.format(MessageFormat.java:836)
    at java.text.Format.format(Format.java:140)
    at java.text.MessageFormat.format(MessageFormat.java:812)
    at ch.qos.cal10n.MessageConveyor.getMessage(MessageConveyor.java:89)
    at org.jboss.weld.logging.WeldMessageConveyor.getMessage(WeldMessageConveyor.java:78)
    at org.slf4j.cal10n.LocLogger.debug(LocLogger.java:95)
    at org.jboss.weld.conversation.ConversationImpl.switchTo(ConversationImpl.java:190)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
    at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:113)
    at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
    at org.jboss.weld.conversation.ConversationImpl_$$_javassist_2.switchTo(ConversationImpl_$$_javassist_2.java)
    at org.jboss.weld.conversation.AbstractConversationManager.beginOrRestoreConversation(AbstractConversationManager.java:137)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
    at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:113)
    at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
    at org.jboss.weld.conversation.ServletConversationManager_$$_javassist_0.beginOrRestoreConversation(ServletConversationManager_$$_javassist_0.java)
    at org.jboss.weld.jsf.WeldPhaseListener.initiateSessionAndConversation(WeldPhaseListener.java:171)
    at org.jboss.weld.jsf.WeldPhaseListener.beforeRestoreView(WeldPhaseListener.java:118)
    at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:87)
    at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

何がうまくいかなかったのですか?

ありがとうございました !

4

3 に答える 3

1

CDI の観点からは、コードは機能するはずです (実際には JBoss AS 6 で機能します)。会話が 2 つのリクエスト間で伝播されていないように見えますが、JSF フォーム送信を使用する場合は暗黙的である必要があります。セットアップが間違っていて、Tomcat が適切に構成されていないと思います。

最初のステップとして、ここで説明されているように、会話 ID を手動で伝達してみてください。

于 2011-04-21T05:27:39.713 に答える
1

同じことを確認したので、会話を開始するとすぐにページにリダイレクトすることで回避します。フォーム ID プレフィックスに基づいて、アプリのどの部分で会話が必要かがわかっているため、初期段階のリスナーでこれを行うことができます。ビューの復元後はうまく機能します。より理想的な復元前のビューからのリダイレクトの実行に問題があります。

リダイレクト先の完全な URL を提供できる FacesContext.getExternalContext().getRequest() から HttpServletRequest を使用することになりました。私はそれをコードに分解し、再結合します - コードの構造と、フォームとパラメータの概念を含む再利用可能なクラスです。例外処理を取り除いたsendRedirectは

ExternalContext external = faces.getExternalContext();
String baseUrl = external.getRequestContextPath() + m_formId;
String target = external.encodeRedirectURL(baseUrl, m_requestParameters);
external.redirect(target);
于 2011-11-11T17:54:37.267 に答える