2012-06-22 70 views
3

我有问题让用户知道在PrimeFacesLazyDataModel#load方法中发生的异常。如何处理Primefaces延迟加载中的错误?

我从数据库加载数据,当发生异常时,我不知道如何通知用户它。

我试图将FacesMessage添加到FacesContext,但即使Growl设置为autoUpdate="true",消息也不会显示在Growl组件上。

使用PrimeFaces 3.3

+0

我在我的PRO帐户下报告了它,它在3.5.21和4.0.5版本中被修复。 https://code.google.com/p/primefaces/issues/detail?id=4945 – Melloware

回答

3

它不起作用,因为load()方法在渲染响应阶段被调用(您可以通过打印FacesContext.getCurrentInstance().getCurrentPhaseId()来检查),当所有消息都已经被处理时。

对我而言,唯一的解决方法是将数据加载到DataTable的事件侦听器的“页面”中。

HTML:

<p:dataTable value="#{controller.model}" binding="#{controller.table}"> 
    <p:ajax event="page" listener="#{controller.onPagination}" /> 
</p:dataTable> 

控制器:

private List<DTO> listDTO; 
private int rowCount; 
private DataTable table; 

private LazyDataModel<DTO> model = new LazyDataModel<DTO>() { 
     @Override 
     public List<DTO> load(int first, int pageSize, String sortField, 
       SortOrder sortOrder, Map<String, String> filters) { 
      setRowCount(rowCount); 
      return listDTO; 
     } 
    }; 

public void onPagination(PageEvent event) { 
    FacesContext ctx = FacesContext.getCurrentInstance(); 
    Map<String, String> params = ctx.getExternalContext() 
      .getRequestParameterMap(); 

    // You cannot use DataTable.getRows() and DataTable.getFirst() here, 
    // it seems that these fields are set during Render Response phase 
    // and not during Update Model phase as one can expect. 

    String clientId = table.getClientId(); 
    int first = Integer.parseInt(params.get(clientId + "_first")); 
    int pageSize = Integer.parseInt(params.get(clientId + "_rows")); 

    try { 
     listDTO = DAO.query(first, pageSize); 
     rowCount = DAO.getRowCount(); 
    } catch (SQLException e) { 
     ctx.addMessage(null, 
       new FacesMessage(FacesMessage.SEVERITY_ERROR, 
        "SQL error", 
        "SQL error")); 
    } 
} 

希望这有助于。

+0

感谢它的帮助。 – valerian