#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