1

私はp:dataTablewithp:contextMenuといくつかp:menuitemの s を持っています。これらのメニュー項目の 1 つは、ここで指摘されているように読み取られる別のビューに ID を渡す必要があります。

問題は、ID が送信されなかったように、コンバーターが必要なメッセージをスローすることです。実際には送信されていないようです。何か基本的なことが欠けていると思いますが、本当に理解できませんでした。コードは次のとおりです。

ソースビュー

<h:form id="formTabela">
    <p:fieldset>
        <p:dataTable id="sistemas"
                     selection="#{sistemaMb.sistemaSelecionado}">
            (...)
        </p:dataTable>
    </p:fieldset>

    <p:contextMenu for="sistemas">
        <p:menuitem value="Gerenciar módulos" icon="ui-icon-search" 
                    action="modulos?faces-redirect=true&amp;includeViewParams=true"
                    ajax="false">  
            <f:param name="id" value="#{sistemaMb.sistemaSelecionado.id}"/>
        </p:menuitem>

        (More items...)
    </p:contextMenu>

    (Some dialogs...)
</h:form>

ターゲット ビュー (モジュロ)

<!-- This is on body: -->
<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="id" value="#{moduloMb.sistema}" 
                     converterMessage="foo"
                     required="true" 
                     requiredMessage="bar"/>

        <f:event type="preRenderView" listener="#{moduloMb.init()}" />
    </f:metadata>
</ui:define>

ターゲット ビュー マネージド Bean

@ManagedBean
@ViewScoped
public class ModuloMb implements Serializable {
    private Sistema sistema;

    @PostConstruct
    public void init() {
        if (!Faces.isPostback() && !Faces.isValidationFailed()) {
            // business stuff, but "sistema" is always null.
        }
    }

    public Sistema getSistema() {
        return sistema;
    }

    public void setSistema(Sistema sistema) {
        this.sistema = sistema;
    }

    (...)

}

コンバーター

@FacesConverter(forClass = Sistema.class)
public class SistemaConverter implements Converter {

    private final SistemaService sistemaService = lookup(SistemaService.class);

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, 
                              String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }

        Optional<Sistema> optSistema = sistemaService.find(Short.valueOf(value));
        if (!optSistema.isPresent())
            throw new ConverterException(
                    new FacesMessage("Id de sistema inválido " + value));
        return optSistema.get();
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, 
                              Object value) {
        if (!(value instanceof Sistema) || ((Sistema) value).getId() != null) {
            return null;
        }

        return ((Sistema) value).getId().toString();
    }

}
4

1 に答える 1

1

p:menuitem の結果文字列で使用する includeViewParams ディレクティブは、ターゲット ビューへの GET 要求の要求パラメーターとしてビュー パラメーターの特別なセットを挿入するよう JSF に指示します。

しかし、f:param はビュー パラメータを定義しておらず、GET リクエストが行われる URL にも追加されません。

パラメータを暗黙のナビゲーション結果に直接追加すると機能します: "modulod?faces-redirect=true&id=..."

于 2013-06-18T22:19:11.607 に答える