我想实现自定义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);
}
}
答案 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。源代码可在该页面上找到。
javax.faces.application.ViewHandlerWrapper
提供ViewHandler的简单实现,开发人员可以将其子类化,并希望为现有的ViewHandler实例提供专门的行为。所有方法的默认>实现是调用包装的ViewHandler。
用法:扩展此类并覆盖getWrapped以返回我们正在包装的实例。