[Seasar-user:12706] Renderer内部で指定したActionMethodが呼ばれない

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2008年 1月 31日 (木) 19:49:10 JST


お疲れ様です、加祥です。

参考資料のソースのように、HtmlCommandButtonRendererを
extendしたカスタムタグを作成し、Renderer内部でActionMethodを
設定(ソース内の−−−→の箇所)しています。
ですが、このアクションメソッドが呼び出されないケースが
あります。

以下、調査状況とご教示頂きたい観点をまとめています。
よろしくお願いしますm(__)m

【調査状況】
どういうケースの時に発生するか絞込みはまだできていない
状態です。
ただ、このカスタムタグを使用した画面を表示する時のRender
Response の After Phase で 
viewroot.childrenList.list.elementData[].action に 
SimpleMethodBindingのオブジェクトが生成され、メンバの
outcome,transientには下記の様に値が入っていることを確認
しました。
 ・outcome="ENDMOBILE"
 ・transient=false
ですが、このボタンを押下した最初のRestore View の
After Phase で上記の値を参照すると、SimpleMethodBinding
がなくなりnullになっています。

【ご教示頂きたい観点】
・ビューの保管は Render Response Phase で行うと思い、Renderer
 の中でActionMethodを指定しているが、手法に問題ないか。
 (下記の場所でのActionMethodの指定は問題ないか?)
・こういうケースが発生する要因はどいういうものがあるか。

【参考資料】
public class CmnMobileEndBtnRenderer extends HtmlCommandButtonRenderer {

    /** COMPONENT_FAMILY */
    public static final String COMPONENT_FAMILY = "CsMbEndBtnFamily";

    /** RENDERER_TYPE */
    public static final String RENDERER_TYPE = "CmnMobileEndBtnRenderer";

    /** ignoreComponent */
    private final IgnoreAttribute ignoreComponent = new IgnoreAttribute();
    {
        ignoreComponent.addAttributeName(JsfConstants.ID_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.NAME_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.TYPE_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.VALUE_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.IMAGE_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.ACTION_ATTR);
        ignoreComponent.addAttributeName(JsfConstants.IMMEDIATE_ATTR);
    }

    /**
     * encodeHtmlCommandButtonEnd
     * @param context FacesContest
     * @param htmlCommandButton HtmlCommandButton
     * @throws IOException IOException
     */
    protected void encodeHtmlCommandButtonEnd(FacesContext context,
            HtmlCommandButton htmlCommandButton) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.startElement(JsfConstants.INPUT_ELEM, htmlCommandButton);
        final String image = htmlCommandButton.getImage();
        final boolean isImageType = StringUtil.isNotBlank(image);
        String type;
        if (isImageType) {
            type = JsfConstants.IMAGE_VALUE;
        } else {
            type = htmlCommandButton.getType();
        }
        RendererUtil.renderAttribute(writer, JsfConstants.TYPE_ATTR, type);
        RendererUtil.renderAttribute(writer, JsfConstants.VALUE_ATTR, "終了");

        final String id = getIdForRender(context, htmlCommandButton);
        RendererUtil
                .renderIdAttributeIfNecessary(writer, htmlCommandButton, id);
        RendererUtil.renderAttribute(writer, JsfConstants.NAME_ATTR,
                htmlCommandButton.getClientId(context));

        if (isImageType) {
            RendererUtil.renderAttribute(writer, JsfConstants.SRC_ATTR, image,
                    JsfConstants.IMAGE_ATTR);
        } else {
            renderValueAttribute(context, htmlCommandButton, writer);
        }
        htmlCommandButton.setValue("終了");
−−−→htmlCommandButton.setAction(new SimpleMethodBinding("ENDMOBILE"));
        renderRemainAttributes(htmlCommandButton, writer, ignoreComponent);
        writer.endElement(JsfConstants.INPUT_ELEM);
    }
}


Seasar-user メーリングリストの案内