首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

JSF 捕獲 Managed Bean 建構子異常:VariableResolver 切入點實戰

     編輯:J2EE

問題背景

Action 方法拋出異常可用 ActionListener 捕獲,但 Managed Bean 建構子異常 發生在建構階段,Filter 僅能捕獲包裝後的 ServletException,無法還原原始異常。

解決方案:自訂 VariableResolver

JSF 透過 VariableResolver 解析並實例化 Managed Bean。繼承實作類並覆寫 resolveVariable 即可攔截建構異常。

MyFaces 環境範例

public class VariableResolverImpl extends org.apache.myfaces.el.VariableResolverImpl {
    private static final String ERROR_FLAG = "error";
    private static final String EXCEPTION_TYPE = "exception";

    @Override
    public Object resolveVariable(FacesContext facesContext, String name) {
        try {
            return super.resolveVariable(facesContext, name);
        } catch (Throwable e) {
            HttpServletRequest request = (HttpServletRequest) 
                facesContext.getExternalContext().getRequest();
            request.setAttribute(ERROR_FLAG, Boolean.TRUE);
            request.setAttribute(EXCEPTION_TYPE, e);
            throw new RuntimeException(e); // 保持原始堆疊
        }
    }
}

註冊至 faces-config.xml

<faces-config>
  <application>
    <variable-resolver>mypackage.VariableResolverImpl</variable-resolver>
  </application>
</faces-config>

Filter 中處理原始異常

public class AppFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
            throws IOException, ServletException {
        try {
            chain.doFilter(req, resp);
        } catch (ServletException e) {
            Boolean error = (Boolean) req.getAttribute("error");
            if (Boolean.TRUE.equals(error)) {
                Throwable te = (Throwable) req.getAttribute("exception");
                if (te instanceof AppException) {
                    // 業務異常處理
                } else {
                    // 系統異常處理
                }
            } else {
                // 其他 ServletException
            }
        }
    }
}

關鍵點總結

  • 切入點:VariableResolver.resolveVariable() —— Bean 實例化瞬間
  • 異常透傳:Request 屬性攜帶原始 Throwable
  • Filter 最後統一處理,避免業務代碼散落
  • 適用於安全檢查、資源初始化失敗、配置錯誤等建構期異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved