0

我想实现一个自定义 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);
}

}
4

1 回答 1

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 文档

javax.faces.application.ViewHandlerWrapper

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

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

于 2014-06-18T14:35:29.460 回答