用于JBoss 7.1的自定义Viewhandler

时间:2013-07-02 09:09:59

标签: jsf java-ee primefaces

我想实现自定义ViewHandler。目前我只将所有调用转发到默认的Viewhandler,但如果我在faces-config.xml中启用此ViewHandler,则会破坏preRenderView事件类型(可能还有其他功能)。有没有人没有我做错了什么?

我正在使用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 个答案:

答案 0 :(得分: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;
    }
}

如果您想要一个更完整且功能更强的自定义视图处理程序,请查看OmniFaces RestorableViewHandler。源代码可在该页面上找到。

来自Java Doc

  

javax.faces.application.ViewHandlerWrapper

     

提供ViewHandler的简单实现,开发人员可以将其子类化,并希望为现有的ViewHandler实例提供专门的行为。所有方法的默认>实现是调用包装的ViewHandler。

     

用法:扩展此类并覆盖getWrapped以返回我们正在包装的实例。