2013-07-02 97 views
0

我想實現一個自定義的ViewHandler。目前,我只將所有調用轉發給默認的Viewhandler,但是如果在我的faces-config.xml中啓用此ViewHandler,preRenderView事件類型(以及其他功能)就會中斷。有沒有人沒有我做錯了什麼?JBoss 7.1自定義查看器

我正在使用JBoss AS 7.1.1。

謝謝。

public class ReverseProxyViewHandler extends ViewHandler { 

ViewHandler defaultHandler; 

public ReverseProxyViewHandler(ViewHandler defaultHandler) { 
    this.defaultHandler = defaultHandler; 
} 

@Override 
public Locale calculateLocale(FacesContext context) { 
    return defaultHandler.calculateLocale(context); 
} 

@Override 
public String calculateRenderKitId(FacesContext context) { 
    return defaultHandler.calculateRenderKitId(context); 
} 

@Override 
public UIViewRoot createView(FacesContext context, String viewId) { 
    return defaultHandler.createView(context, viewId); 
} 

@Override 
public String getActionURL(FacesContext context, String path) { 
    return defaultHandler.getActionURL(context, path); 
} 

@Override 
public String getResourceURL(FacesContext context, String path) { 
    return defaultHandler.getResourceURL(context, path); 
} 

@Override 
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException { 
    defaultHandler.renderView(context, viewToRender); 
} 

@Override 
public UIViewRoot restoreView(FacesContext context, String viewId) { 
    return defaultHandler.restoreView(context, viewId); 
} 

@Override 
public void writeState(FacesContext context) throws IOException { 
    defaultHandler.writeState(context); 
} 

} 

回答

1

我有同樣的錯誤,但通過延長ViewHandlerWrapper代替了ViewHandler我得到它的工作。

這裏是我的CustomViewHandler的例子(不是一個完整的例子,但我們的應用程序中建作爲概念證明):

import javax.faces.application.ViewExpiredException; 
import javax.faces.application.ViewHandler; 
import javax.faces.application.ViewHandlerWrapper; 
import javax.faces.component.UIViewRoot; 
import javax.faces.context.FacesContext; 

import org.apache.log4j.Logger; 

public class CustomViewHandler extends ViewHandlerWrapper { 

    private ViewHandler wrapped; 
    private static Logger LOGGER = Logger.getLogger(CustomViewHandler.class); 

    public CustomViewHandler(ViewHandler wrapped) { 
     LOGGER.info("CustomViewHandler.CustomViewHandler():wrapped View Handler:"+wrapped.getClass()); 
     this.wrapped = wrapped; 
    } 

    @Override 
    public UIViewRoot restoreView(FacesContext context, String viewId) { 
     UIViewRoot root; 
     try { 
      LOGGER.info("restoring view : " + viewId); 
      root = wrapped.restoreView(context, viewId); 
     } catch (ViewExpiredException e) { 
      LOGGER.error("View Expired : " + e.getMessage() + " -> recreating"); 
      root = wrapped.createView(context, viewId); 
     } 
     return root; 
    } 

    @Override 
    public ViewHandler getWrapped() { 
     return wrapped; 
    } 
} 

如果你想要一個更完整,功能自定義視圖處理程序,看看在OmniFacesRestorableViewHandler。源代碼在該頁面上可用。

從Java文檔

javax.faces.application.ViewHandlerWrapper

提供了一個簡單的ViewHandler實現,可以由開發人員創建子類>希望爲客戶提供專業化的行爲到現有的ViewHandler實例。所有方法的默認>實現是調用到包裝的ViewHandler。

用法:擴展此類並重寫getWrapped以返回要包裝的實例。