动态添加Primefaces组件

nik*_*gra 5 java jsf selectonemenu java-ee primefaces

我想动态添加Primefaces组件.我正在使用与此类似的解决方案,前面已经讨论过:

<h:form>
    <h:panelGrid columns="2">
        <p:dataGrid id="categoriesGrid" value="#{bean.categories}"
            var="categoryBean" rowIndexVar="rowIndex">
            <p:column>
                <p:selectOneMenu id="categorySelect" effect="drop"
                    value="#{categoryBean.selectedCategory}" >
                    <f:selectItems value="#{categoryBean.availableCategories}"
                        var="category" itemLabel="#{category.name}"
                        itemValue="#{category}" />
                </p:selectOneMenu>
            </p:column>
        </p:dataGrid>
        <p:commandButton actionListener="#{bean.addNewCategory}"
            value="Add category" update="categoriesGrid"/>
    </h:panelGrid>
</h:form>
Run Code Online (Sandbox Code Playgroud)

但它有问题.在点击"添加类别"按钮后,我得到了回复示例:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<error>
    <error-name>
        class javax.faces.component.UpdateModelException
    </error-name>
    <error-message>
        <![CDATA[/createTutorial.xhtml @85,65 value=
            "#{categoryBean.selectedCategory}":java.util.NoSuchElementException]]>
    </error-message>
</error>
</partial-response>
Run Code Online (Sandbox Code Playgroud)

提前致谢

nik*_*gra 2

问题出在我的豆子上。为了获得选定的项目,我必须实现javax.faces.Converter接口的自定义实现。在我看来,对于这样一个简单的问题需要做很多工作(这个转换器必须能够访问数据源等)。所以我想了一个小技巧:

public class CategoryBean{

    private list<Category> availableCategories;
    private Category selectedCategory;

    public Long getCSelectedCategory(){
        // Get selected category by it's id and set selectedCategory
    }

    public void setSelectedCategory(Long selectedCategory){
        return selectedCategory.getId();
    }

    // The remaining setters and getters
}
Run Code Online (Sandbox Code Playgroud)

相应的页面代码现在如下所示:

public class CategoryBean{

    private list<Category> availableCategories;
    private Category selectedCategory;

    public Long getCSelectedCategory(){
        // Get selected category by it's id and set selectedCategory
    }

    public void setSelectedCategory(Long selectedCategory){
        return selectedCategory.getId();
    }

    // The remaining setters and getters
}
Run Code Online (Sandbox Code Playgroud)

请注意itemValue显示的属性和访问方法。我遇到的错误是 getter 返回类型错误。

结论是,在我的例子中动态添加新的 Primefaces 组件的唯一问题是返回选定的值。您可以实现转换器或使用类似的技巧。

您认为这样的技巧是一个好的解决方案吗?