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 に答える