f:p中的setPropertyActionListener:commandLink没有将属性值设置为目标请求范围的bean

时间:2014-03-23 06:33:01

标签: jsf primefaces jsf-2.2

我尝试使用<f:setPropertyActionListener>内的<p:commandLink>设置属性值到目标bean,如下所示。

<h:form id="form" prependId="true">
    <p:panel id="dataPanel" closable="false" toggleOrientation="horizontal" toggleable="true" style="border: none; text-align: center;">
        <p:dataGrid id="dataGrid" value="#{productDetailsManagedBean}" var="row" rowIndexVar="rowIndex" rows="4" first="0" columns="1" paginator="true" paginatorAlwaysVisible="false" pageLinks="10" lazy="true" rowsPerPageTemplate="5,10,15">

            <p:commandLink process="@this">
                <h:outputText styleClass="ui-icon ui-icon-search" style="margin:0 auto;" />
                <!--row.subCatName is correctly retrieved here.-->
                <f:setPropertyActionListener value="#{row.subCatName}" target="#{productDetailsManagedBean.subCatName}" />
            </p:commandLink>

        </p:dataGrid>
    </p:panel>
</h:form>

相应的JSF托管bean如下。

@ManagedBean
@RequestScoped
public final class ProductDetailsManagedBean extends LazyDataModel<SubCategory>
{
    public ProductDetailsManagedBean() {}

    @EJB
    private final ProductDetailsBeanLocal productService=null;
    private String subCatName;

    public String getSubCatName() {
        return subCatName;
    }

    public void setSubCatName(String subCatName) {
        System.out.println("setSubCatName() called. : "+subCatName); //Never invoked.
        this.subCatName = subCatName;
    }

    //The following methods are not needed to be reviewed.

    @Override
    public List<SubCategory> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters)
    {
        int rowCount = productService.rowCount().intValue();
        setRowCount(rowCount);
        return productService.getList(first, pageSize);
    }
}

单击<p:commandLink>时,应调用bean setSubCatName(String subCatName)中相应的setter方法,但从不调用此方法,因此bean属性subCatName永远不会设置为值。

我在这里俯瞰什么?

我使用的是Mojarra 2.2.5和PrimeFaces 4.0。

process的{​​{1}}属性已设置为<p:commandLink>。我已经尝试将@this的{​​{1}}设置为prependId,但这也没有任何区别。


修改

当托管bean的范围从<h:form>更改为false时,此方法有效。这也适用于@RequestScoped bean。我在这做什么错?这是预期的行为吗?

1 个答案:

答案 0 :(得分:2)

这确实需要一个范围高于它的工作请求范围(在这种情况下,至少需要一个视图范围的bean)。请see这个答案。