0

jsf web app で例外処理を実装するための指示に従いました。

私の問題は、ExceptionHandler で設定した属性値を表示することです

ここに ExceptionHandler.java があります

    @Override
public void handle() throws FacesException {
    final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
    while (i.hasNext()) {

        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();

        FacesContext fc = FacesContext.getCurrentInstance();
        Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
        NavigationHandler nav = fc.getApplication().getNavigationHandler();

            try {
                // Push some useful stuff to the request scope for
                // use in the page
                System.err.println("DefaultExceptionHandler.handle()...exceptionMessage = " + t.getMessage());
                requestMap.put("exceptionMessage", t.getMessage());
                nav.handleNavigation(fc, null, "error/500");
                fc.renderResponse();
            } finally {
                i.remove();
            }
        }
    getWrapped().handle();
}

および 500.xhtml

<ui:composition  
 xmlns="http://www.w3.org/1999/xhtml"  
 xmlns:h="http://java.sun.com/jsf/html"  
 xmlns:ui="http://java.sun.com/jsf/facelets"  
 xmlns:f="http://java.sun.com/jsf/core">  


   The error message is:  
   <br />
   <b>  
       3. :  #{exceptionMessage}  
   </b>  
   <br />
   <b>  
       1. :  #{requestScope['exceptionMessage']}  
   </b>  
   <br />
   <b>  
       2. :  #{param['exceptionMessage']}  
   </b>  

ブラウザのページは次のようになります。

    The error message is: 
3. : 
1. : 
2. :

前もって感謝します!!

4

1 に答える 1

0

まず、これはリクエスト パラメータではありません。リクエストパラメータは、エンドユーザーが HTTP リクエストとともにサーバーに送信したデータです。GET 要求では、URL のクエリ文字列部分に表示されます。POST 要求では、それらは要求本文に隠されています (ただし、F12 キーでアクセスできるブラウザーの組み込みモニターなどの HTTP トラフィック モニターで表示されます)。設定していたのはリクエスト属性です。したがって、試みから、#{exceptionMessage}機能する#{requestScope['exceptionMessage']}はずだったのですが、#{param['exceptionMessage']}間違いなく機能しませんでした。

具体的な問題に戻ると、これは、ナビゲーションの場合、またはカスタム ナビゲーション ハンドラーのどこかに結果<redirect>を追加することによって、ナビゲーションにリダイレクトを送信しているときに発生する可能性があります。?faces-redirect=trueリダイレクトは基本的にクライアントにまったく新しい HTTP リクエストを作成するように指示します。これにより、すべての属性を含む最初の HTTP リクエストが破棄されます。

それも問題でない場合は、使用されている (カスタマイズされた)FacesContextまたはExternalContext実装が壊れている可能性があります。使用されている JSF impl/バージョン、使用されているサーバー、「サードパーティ」ライブラリについて何も言わなかったため、わかりにくいです。たとえば、Spring Web Flow のExternalContext実装は、いくつかのバージョンでそのように壊れていることが知られています。

于 2013-06-18T15:47:12.130 に答える