Обновите сообщение о рычании jsf из метода загрузки модели LazyDataModel

#jsf #datatable #primefaces

Вопрос:

Мне нужно отобразить сообщение, когда метод загрузки LazyDataModel загружает данные. Я использую primefaces growl для отображения сообщения и обновления его с помощью метода загрузки, используя приведенный ниже код, но он не работает (не вижу никаких сообщений в пользовательском интерфейсе). Пожалуйста, предположите, что я делаю неправильно, кажется, что-то связано с асинхронным поведением метода загрузки, но я не уверен, как это исправить.

Фасоль JSF —

 @ManagedBean(name = "cData")
@ViewScoped
public class DataPage implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 2193735279937686495L;
    
    @PostConstruct
    public void init() {
        FacesContext.getCurrentInstance().addMessage("growl-sticky", new
                  FacesMessage(FacesMessage.SEVERITY_INFO, "Sticky Message",
                  "Message Content from init"));
        loadData();
    }
    
    private void loadData() {
        FacesContext.getCurrentInstance().addMessage("growl-sticky", new
                  FacesMessage(FacesMessage.SEVERITY_INFO, "Sticky Message",
                  "Message loadData before load"));
        setMobiles(new LazyDataModel<Mobile>() {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            @Override
            public List<Mobile> load(int first, int pageSize,

                    String sortField, SortOrder sortOrder,

                    Map<String, Object> filters) {
                List<Mobile> data = new DataRepo().getMobileData();
                mobiles.setRowCount(data.size());
                
                FacesContext.getCurrentInstance().addMessage("growl-sticky", new
                          FacesMessage(FacesMessage.SEVERITY_INFO, "Sticky Message",
                          "Message Content from load"));
                return data;
            }

            @Override
            public Mobile getRowData(String rowKey) {
                // some code
            }

            @Override
            public Object getRowKey(Mobile object) {
                // some code
            }
        });
    }

    public LazyDataModel<Mobile> getMobiles() {
        return mobiles;
    }

    public void setMobiles(LazyDataModel<Mobile> mobiles) {
        this.mobiles = mobiles;
    }

    private LazyDataModel<Mobile> mobiles = null;

}
 

страница xhtml —

 <?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:c = "http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>DataTable tag Example</title>
</h:head>
<h:body>
    <h3>Mobile Details</h3>
    
    <h:form>
    <c:metadata>
        <c:viewAction action="#{cData.showSticky}" />
    </c:metadata>
    
    <p:growl id="growl-sticky" showDetail="true" sticky="true" autoUpdate="true"/>
    <p:commandButton actionListener="#{cData.showSticky}"
        update="growl-sticky" value="Info" style="width: 10rem"
        styleClass="ui-button-help" />
    
        <h:dataTable value="#{cData.mobiles}" var="mobile" border="2" paginator="true" rows="10"
             lazy="true">
            <h:column>
                <c:facet name="header">Name</c:facet>
                    #{mobile.companyname}
                </h:column>
            <h:column>
                <c:facet name="header">Model Number</c:facet>
                    #{mobile.modelnumber}
                </h:column>
            <h:column>
                <c:facet name="header">Color</c:facet>
                    #{mobile.color}
                </h:column>
            <h:column>
                <c:facet name="header">Quantity</c:facet>
                    #{mobile.quantity}
                </h:column>
            <h:column>
                <c:facet name="header">Price</c:facet>
                    #{mobile.price}
                </h:column>

        </h:dataTable>
    </h:form>

</h:body>
</html>
 

Комментарии:

1. Определите «не работает»

2. @LajosArpad Я не вижу никаких сообщений в пользовательском интерфейсе при загрузке страницы.

3. Есть ли у вас ошибки?

4. @ЛайосАрпад нет

Ответ №1:

Проблема, по которой ваше сообщение не отображается, связана с фазой, когда вызывается загрузка. Объяснение и обходной путь ниже.

Метод загрузки вызывается в фазе RENDER_RESPONSE, что неудобно, поскольку здесь могут возникать сообщения об ошибках, которые обычно не отображаются, поскольку сообщения p:в большинстве случаев отображаются как один из первых компонентов.

Проблема: https://github.com/primefaces/primefaces/issues/3501

Обходной путь: https://github.com/primefaces/primefaces/issues/3501#issuecomment-469731529