0

これを実現する方法についていくつかの調査を行い、いくつかの分離されたソリューションを見つけましたが、それらを組み合わせる方法と、どのような方法がベストプラクティスとして構成されているかを理解できませんでした。Tomcat と jsf 2.x を使用しています。

シナリオ: セッション スコープ Bean、mycontrollerA があります。コントローラーは myviewa.xhtml に関連しています。viewA で commandLink をヒットした後、アクション mycontrollerA.doThis() がトリガーされました。このメソッドでは、try-catch を使用し、例外が発生した場合は、例外レポート ビュー 'exception.xhtml' にリダイレクトしたいと考えています。関連するコントローラー ExceptionController には属性「メッセージ」があり、対応する値を myControllerA に設定したいと考えています。

問題: exceptionController Bean を取得しようとすると、エラーが発生します。初期化されていないため、存在しないと思います。別の SessionScoped Bean から SessionScoped Bean を取得する一般的な方法があることを願っています。これは、この「必要に応じて作成する」動作をすぐに処理します。さらに、リダイレクトコードを改善できると思います。

前もって感謝します。

public String doThis() {
    try {
        throw new RuntimeException("TestExc");
} catch (RuntimeException e) {
    //ExceptionController exceptionController = (ExceptionController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("exceptionController");
    //exceptionController.setMessage("Fehlerinfo: " + e.getMessage());
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("exception.xhtml");
        } catch (IOException e1) {
            e1.printStackTrace();
        } 
    }
    return null;
}

@ManagedBean(name = "exceptionController")
@SessionScoped
public class ExceptionController { ... }
4

1 に答える 1

1

ELResolver を介して Bean の解決を試みることができます。

FacesContext fc = FacesContext.getCurrentInstance();
ELContext el = fc.getELContext();
ExceptionController exCtrl = (ExceptionController) el.getELResolver()
    .getValue(el, null, "exceptionController");

あなたの問題はおそらく、Bean が以前に作成されていないため、まだセッションにないことです。ELResolver アプローチでは、作成する必要があります。

于 2013-04-13T09:04:07.810 に答える