1

少し問題があります。cms からログアウトすると、何らかの方法でパラメーターの 1 つのセッターが呼び出され、アクションが実行されます。http500 になります。

具体的には、次を使用して、jsf ページからバッキング (@RequestScoped) Bean にパラメーターを渡します。

<f:metadata>
<f:viewParam name="activate" value="#{myManagedBean.activate}" />

データベースに変更を加えるセッターを使用します。

public void setActivate(int num) {
    ab.changeActiveState("myString", num);
    return;
}

logout メソッドは完全に異なる Bean で使用され、単純なメソッドを呼び出します。

public String logout() {
    Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpServletRequest a = (HttpServletRequest) request;                
    try {
        a.logout();
    } catch(Exception e) {
        logger.info("Error while logout: " + e);
    }
    return "advert-list.xhtml?faces-redirect=true";
}

ログアウトすると次のエラーがスローされます。

javax.servlet.ServletException: javax.el.ELException: /secure/my-list.xhtml @12,81 value="#{myManagedBean.activate}": javax.ejb.EJBException: javax.persistence.NoResultException: No entity found for query
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)  org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349) 
root cause
javax.faces.component.UpdateModelException: javax.el.ELException: /secure/advert-list.xhtml @12,81 value="#{myManagedBean.activate}": javax.ejb.EJBException:
javax.persistence.NoResultException: No entity found for query
javax.faces.component.UIInput.updateModel(UIInput.java:848)
javax.faces.component.UIViewParameter.updateModel(UIViewParameter.java:284)
javax.faces.component.UIInput.processUpdates(UIInput.java:730)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109)
javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1218)   com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:74)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)  org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349)

何が起こっているのか、なぜなのかわかりません。そのセッターについて - それは正常に動作します。ログアウトについて - 私のプロジェクトの他のページからは何もスローせず、現在のユーザーをログアウトします。

4

2 に答える 2

0

最善ではないかもしれませんが、この問題に対処する有効な方法は、セッターに if ステートメントを追加することです。

if (!FacesContext.getCurrentInstance().isPostback()) {
    ab.changeActiveState("myString", num);
}

他にもっと政治的に正しい方法をご存知でしたら、教えてください。

ちなみに、他の方法でパラメーターを渡そうとしましたが、どれも機能しません。Mykongページ( 1 )で何かを読んで、コメントで、これらの方法のいくつかがリクエストスコープのBeanでは機能しないことがわかりました...

マイコンページ

于 2012-07-01T19:26:24.533 に答える
0

ゲッターメソッドと同様に、セッター メソッドでビジネス ロジックを実行するべきではありません。

<f:viewParam>がジョブを完了した後に最初のリクエストに対してアクションを実行する場合は、<f:event type="preRenderView">リスナー メソッドを使用する必要があります。

<f:metadata>
    <f:viewParam name="activate" value="#{myManagedBean.activate}" />
    <f:event type="preRenderView" listener="#{myManagedBean.init}" />
</f:metadata>

private int num;

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        ab.changeActiveState("myString", num);
    }
}

public void setActivate(int num) {
    this.num = num;
}

これは、今後の JSF 2.2 で に置き換えられることに注意してください<f:viewAction onPostback="false">

以下も参照してください。

于 2012-06-28T18:54:15.850 に答える