Primefaces延迟数据表为空

时间:2017-03-01 22:44:44

标签: spring jsf primefaces lazy-loading

我正在尝试在PrimeFaces(5.3)上实现一个惰性数据表,但它从不渲染表。问题是惰性模型类上的load()方法永远不会被调用。该表是从String的arrayList构建的,其中每个String [](长度为5)是表中的一行。

查看(相关代码)

<h:form id="formHome">
            <p:commandButton process="@this" partialSubmit="true" update="@form"
                value="obtener tabla"
                actionListener="#{mbParametros.init}"
                oncomplete="location.reload();">
            </p:commandButton>
    <p:dataTable id="parametros"
                            selection="#{mbParametros.lazy.seleccionados}"
                            rowKey="#{registro[0]}" value="#{mbParameros.lazy}" var="registro"
                            paginator="true" lazy="true" rows="15" selectionMode="single    "
                            paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                            rowsPerPageTemplate="15,30,45" resizableColumns="false"
                            widgetVar="tabla">

                            <p:ajax event="page" oncomplete="location.reload();" />

                            <f:facet name="header">
                                <h:outputText value="Parametros, Fechas y Etiquetas" />
                            </f:facet>

                            <!-- COLUMNA DE CHECKBOXES   -->
                            <p:column selectionMode="multiple" />

                            <!-- COLUMNA DEL ENTORNO GEOGRAFICO -->
                            <p:column id="col0" headerText="#{mbParametros.lazy.header}">

                                <h:outputText value="#{registro[0]}" />

                            </p:column>

                            <!-- COLUMNA DEL TIPO DE PARAMETRO -->
                            <p:column id="col1" headerText="Tipo">
                                <h:outputText value="#{registro[1]}" />
                            </p:column>

                            <!-- COLUMNA DEL NOMBRE DEL PARAMETRO -->
                            <p:column id="col2" headerText="Parametro">
                                <h:outputText value="#{registro[2]}" />
                            </p:column>


                            <!-- COLUMNA DEL VALOR DEL PARAMETRO -->
                            <p:column id="col3" headerText="Valor">
                                <h:outputText value="#{registro[3]}" />

                            </p:column>


                            <!-- COLUMNA DE LA DESCRIPCION DEL PARAMETRO -->
                            <p:column id="col4" headerText="Descripcion">
                                <h:outputText value="#{registro[4]}" />

                            </p:column>


                        </p:dataTable>

</h:form>

控制器(弹簧控制器,弹簧配置有弹簧3.2.16)

@Scope("session")
@Controller("mbParametros")
public class MBParametros implements Serializable {

    private static final Logger LOG = LoggerFactory.getLogger(MBParametros.class);
    private static final long serialVersionUID = 1L;

    @Autowired
    private ResourceBundleMessageSource recursos;

    private LazyDataModel<String[]> lazy;

    public void init() {
        LOG.info("ENTRA AL INIT");
        this.setLazy(new ModeloLazy(recursos) {
            private static final long serialVersionUID = 1L;

        });
    }

    public LazyDataModel<String[]> getLazy() {
        return lazy;
    }

    public void setLazy(LazyDataModel<String[]> lazy) {
        this.lazy = lazy;
    }

懒惰模型类(仅限相关代码)

 public class ModeloLazy extends LazyDataModel<String[]> {
      // ArrayList of Strings that represent all table rows
    private List<String[]> tabla;    

    public List<String[]> getTabla() {
        return tabla;
    }

    public void setTabla(List<String[]> tabla) {
        this.tabla = tabla;
    }
    // all other fields, getters, setters, init, etc.....
        // constructor
 public ModeloLazy(ResourceBundleMessageSource recursos) {
            this.recursos = recursos;
            this.init();
 }

        // load never gets called by the framework, so its an error somewhere else
        @Override
public List<String[]> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
            this.setRowCount(15);
            return this.getTabla();
        }

    // init() calls this method for building the table
    // after execution, tabla is not null nor empty. 
    private void construir(DTOResponse result, DTORequest request) {
            List<DTORegistro> registros = bsd.join(result, request); //OK
            for (DTORegistro dtoRegistro : registros) {
                String tipo; 
                switch(dtoRegistro.getParametro().getTipo()) {
                case 'p':
                    tipo = "Parametro";
                    break;
                case 'e':
                    tipo = "Etiqueta";
                    break;
                default:
                    tipo = "Fecha";
                }
                String[] reg = {dtoRegistro.getDto().getNombre() + tipo
                        + dtoRegistro.getParametro().getValor() + dtoRegistro.getParametro().getDescripcion()};
                this.getTabla().add(reg);
            }

        }

    }

1 个答案:

答案 0 :(得分:0)

在我的实现类的构造函数中调用LazyDataModel.setRowCount(int rowCount)之前,我的LazyDataModel实现也不会显示行。

我的<p:dataTable>加载超过16K行,因此我使用了一个在选择页面时调用load()的分页符。 load()根据参数firstpageSize获取指定的行,然后调用setRowCount(int rowCount),然后在DataTable中显示正确的数据页。