3

@ManagedBean注釈付きで Primefaces を使用して JSF を使用していますが、次の問題が発生しました。

onerror「 」がトリガーされないのはなぜですか? 例外はコンソールに表示されます。

login.xhtml

<p:commandButton 
     value="teste" 
     action="#{loginBean.methodTest()}" 
     ajax="true" 
     immediate="false" 
     onerror="confirmation.show()" />

<p:dialog  
    appendToBody="true" 
    header="Atencao" 
    widgetVar="confirmation"  
    showEffect="bounce">  
     ...  
</p:dialog>  

マイビーン

@ManagedBean(name = "loginBean") 
@SessionScoped  
public class LoginBean {

    public void methodTest() throws Exception {
        System.out.println("hi");       
        throw new Exception("Exception Test");           
    }
4

3 に答える 3

7

これは予想される動作です...

onerror : ajax リクエストが失敗したときに実行するクライアント側のコールバック。

あなたの場合、ajaxリクエストにまったく失敗はありません。例外をスローしているという事実は、ajaxの失敗とは何の関係もありません

onerror は、jsf が例外、http エラーなどをキャッチしないときに呼び出されます。例外 != エラー。

詳細については、このスレッドをお読みくださいAjax エンジン: onerror が機能しません(いくつかのヒントが得られるかもしれません...)

f:ajax onerrorについては、次の詳細な説明を参照してください。

于 2012-07-26T06:00:39.127 に答える
4

onerror 属性は、自分で提供する必要がある http エラー ステータス コードを探します。

あなたの最初の例では

public void methodTest() {
  ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
  HttpServletResponse response = (HttpServletResponse) context.getResponse();
  response.setStatus(500); 

  System.out.println("hi");
}

動作するはずです。

于 2014-01-06T10:25:19.693 に答える
0

みんな、ありがとう。

私はこの問題をあまり良い方法で解決しませんでした (しかし、うまくいきました!) 「catch」に Ajax エラーをスローし、「onerror」(oncomplete の insted) がそれを受け取り、ダイアログを開きたいと思います。

可能性はありますか??

悪い方法でうまくいった例:

    <p:panel id="PanelLogin" header="Login"  >    
      <h:form id="FormLogin"  >
        <br/>

          <h:panelGrid columns="2">
               <h:outputLabel for="user" value="Usuario:" />
               <p:inputText id="user" required="true"   value=" "  size="75"  />    

               <h:outputLabel for="pin" value="Senha:" />
               <p:password id="pin" required="true"  value=" " size="55" />                     
          </h:panelGrid>                                                

         <p:commandButton  styleClass="botaoLogin" value="OK" action="#{loginBean.checkLogin()}" ajax="true" oncomplete="if (#{loginBean.dialog}) confirmation.show()"  />

        </h:form>
</p:panel>

<p:dialog id="atencaoDialog" resizable="false" appendToBody="true" header="Atencao" widgetVar="confirmation"  height="85" width="300" showEffect="bounce">


 <div align="center">                   
   <p:messages id="outputTextAtencaoDialog"  autoUpdate="true" redisplay="false"   />  
 </div>                 


 <div style="text-align: center;">
  <p:commandButton id="okButtonAtencaoDialog" value="OK"  onclick="confirmation.hide();" />                         
 </div>
</p:dialog>

マイビーン

 @ManagedBean(name = "loginBean")
    @SessionScoped
    public class LoginBean implements Serializable {

    private boolean dialog;

    ...

    public String checarAutenticacao() {

    ...

    try {

    ...

    return "/templantes/telaAplicacao.xhtml";

     } catch (Throwable e) {

       this.dialog = true;
       // try to throw Ajax error instead of this below ??            
       FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(e.getMessage()));
       return null;
     }
    }
于 2012-07-31T16:08:46.350 に答える