Я не нашел хорошего ответа, поэтому эта проблема. Может быть, мне просто нужно понять, как с этим справиться. Я реализовал через contextMenu элемент меню для удаления выбранных строк. Это больше не работает. Кроме того, редактирование больше не работает. Я реализовал редактор строк. Когда я нажимаю на него, он активируется, и я могу начать редактирование, но когда я нажимаю «ОК» или «Прервать», ничего не происходит.
Ни один метод не вызывается. Ни для удаления, ни для редактирования, ни даже для выбора. Очевидно, это как-то связано с lazyDataModel, но как я могу это изменить.
Мой контроллер:
@Scope(value = "session")
@Component(value = "telefonbuchList")
@ELBeanName(value = "telefonbuchList")
@Join(path = "/", to = "/eintraege-liste.jsf")
public class TelefonbuchListController extends LazyDataModel<Telefonbuch> {
private static final long serialVersionUID = 1L;
@Autowired
private TelefonbuchRepository telefonbuchRepository;
private List<Telefonbuch> selectedEntries;
private LazyDataModel<Telefonbuch> lazyModel;
private int pageSize = 5;
public void deleteEntry() {
telefonbuchRepository.deleteAll(selectedEntries);
lazyModel.getWrappedData().removeAll(selectedEntries);
selectedEntries.clear();
}
public LazyDataModel<Telefonbuch> getLazyModel() {
return lazyModel;
}
@Override
public int getPageSize() {
return pageSize;
}
@Override
public Telefonbuch getRowData(String rowKey) {
List<Telefonbuch> list = getWrappedData();
for (Telefonbuch telefonbuch : list) {
if (telefonbuch.getId().toString().equals(rowKey)) {
return telefonbuch;
}
}
return null;
}
@Override
public Object getRowKey(Telefonbuch telefonbuch) {
return telefonbuch != null ? telefonbuch.getId() : null;
}
public List<Telefonbuch> getSelectedEntries() {
return selectedEntries;
}
@Deferred
@RequestAction
@IgnorePostback
public void loadData() {
lazyModel = new LazyDataModel<Telefonbuch>() {
private static final long serialVersionUID = 1L;
@Override
public List<Telefonbuch> load(int first, int pageSize, String sortField, SortOrder sortOrder,
Map<String, Object> filters) {
List<Telefonbuch> result = new ArrayList<Telefonbuch>();
if (first == 0) {
if (sortField != null && !sortField.isEmpty()) {
if (sortOrder.name().equalsIgnoreCase("ascending")) {
result = telefonbuchRepository
.findAll(PageRequest.of(first, pageSize, Sort.by(sortField).ascending()))
.getContent();
} else if (sortOrder.name().equalsIgnoreCase("descending")) {
result = telefonbuchRepository
.findAll(PageRequest.of(first, pageSize, Sort.by(sortField).descending()))
.getContent();
}
} else {
result = telefonbuchRepository.findAll(PageRequest.of(first, pageSize)).getContent();
}
} else {
first = first / pageSize;
if (sortField != null && !sortField.isEmpty()) {
if (sortOrder.name().equalsIgnoreCase("ascending")) {
result = telefonbuchRepository
.findAll(PageRequest.of(first, pageSize, Sort.by(sortField).ascending()))
.getContent();
} else if (sortOrder.name().equalsIgnoreCase("descending")) {
result = telefonbuchRepository
.findAll(PageRequest.of(first, pageSize, Sort.by(sortField).descending()))
.getContent();
}
} else {
result = telefonbuchRepository.findAll(PageRequest.of(first, pageSize)).getContent();
}
}
return result;
}
};
lazyModel.setRowCount((int) telefonbuchRepository.count());
lazyModel.setPageSize(pageSize);
}
public void onCellEdit(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
telefonbuchRepository.save((Telefonbuch) newValue);
}
public void onRowCancel(RowEditEvent event) {
}
public void onRowEdit(RowEditEvent event) {
Object oldValue = event.getObject();
telefonbuchRepository.save((Telefonbuch) oldValue);
FacesMessage msg = new FacesMessage("Eintrag geändert",
((Telefonbuch) event.getObject()).getVorname() + " " + ((Telefonbuch) event.getObject()).getNachname());
FacesContext.getCurrentInstance().addMessage("eintraege-list", msg);
}
@Override
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setSelectedEntries(List<Telefonbuch> selectedEntries) {
this.selectedEntries = selectedEntries;
}
.xhtml:
<h:form id = "eintraegeList">
<p:panel header = "Liste aller Einträge">
<p:dataTable id = "table" var = "telefonbuch" lazy = "true" widgetVar = "tableWv" value = "#{telefonbuchList.lazyModel}" stickyHeader = "true" editable = "true" resizableColumns = "true" liveResize = "true" style = "margin-bottom:20px" paginator = "true" rows = "#{telefonbuchList.pageSize}" dynamic = "true" emptyMessage = "Keine Telefonbucheinträge vorhanden" selection = "#{telefonbuchList.selectedEntries}" selectionMode = "multiple" rowKey = "#{telefonbuch.id}"
currentPageReportTemplate = "{startRecord}-{endRecord} von {totalRecords}"
paginatorTemplate = "{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} {Exporters}"
rowsPerPageTemplate = "5,8,10">
<f:facet name = "header">
<p:commandButton id = "toggler" type = "button" value = "Anzeige" style = "float:right" icon = "pi pi-align-justify" />
<p:columnToggler datasource = "table" trigger = "toggler" />
</f:facet>
<p:ajax event = "rowEdit" listener = "#{telefonbuchList.onRowEdit}" update = "table" />
<p:ajax event = "rowEditCancel" listener = "#{telefonbuchList.onRowCancel}" update = "table" />
<p:ajax event = "cellEdit" listener = "#{telefonbuchList.onCellEdit}" update = "table" />
<p:separator />
<p:column headerText = "ID" sortBy = "#{telefonbuch.id}">
<h:outputText value = "#{telefonbuch.id}" />
</p:column>
<p:column headerText = "Vorname" sortBy = "#{telefonbuch.vorname}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.vorname}" /></f:facet>
<f:facet name = "input"><p:inputText id = "vornameInput" value = "#{telefonbuch.vorname}" style = "width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText = "Nachname" sortBy = "#{telefonbuch.nachname}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.nachname}" /></f:facet>
<f:facet name = "input"><p:inputText id = "nachnameInput" value = "#{telefonbuch.nachname}" style = "width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText = "Telefonnummer" sortBy = "#{telefonbuch.telefonnummer}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.telefonnummer}" /></f:facet>
<f:facet name = "input"><p:inputText id = "telefonnummerInput" value = "#{telefonbuch.telefonnummer}" style = "width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText = "Handynummer" sortBy = "#{telefonbuch.handynummer}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.handynummer}" /></f:facet>
<f:facet name = "input"><p:inputText id = "handynummerInput" value = "#{telefonbuch.handynummer}" style = "width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText = "Geschäftsstelle" sortBy = "#{telefonbuch.geschaeftsstelle}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.geschaeftsstelle}" /></f:facet>
<f:facet name = "input">
<p:selectOneMenu value = "#{telefonbuch.geschaeftsstelle}" style = "width:100%">
<f:selectItems value = "#{telefonbuchController.geschaeftsstellen}" var = "c" itemLabel = "#{geschaeftsstelle}" itemValue = "#{geschaeftsstelle}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText = "Geschlecht" sortBy = "#{telefonbuch.gender.shortGender}">
<p:cellEditor>
<f:facet name = "output"><h:outputText value = "#{telefonbuch.gender.shortGender}" /></f:facet>
<f:facet name = "input">
<p:selectOneMenu id = "gender" value = "#{telefonbuch.gender}" style = "width:100%">
<f:selectItem itemLabel = "Keine Angabe" itemValue = "" />
<f:selectItems value = "#{telefonbuch.genders}" var = "gender" itemLabel = "#{gender.shortGender}" itemValue = "#{gender}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style = "width:20px;text-align:center;">
<p:rowEditor />
</p:column>
</p:dataTable>
<p:growl id = "growl" showDetail = "true" for = "eintraege-list">
<p:autoUpdate />
</p:growl>
<p:separator />
<p:contextMenu for = "table">
<h:outputStylesheet library = "webjars" name = "font-awesome/5.7.1/css/fontawesome.min-jsf.css" />
<p:menuitem value = "Löschen" update = "table" icon = "fas fa-eraser" action = "#{telefonbuchList.deleteEntry}"/>
<p:menuitem value = "Edit Cell" icon = "pi pi-search" onclick = "PF('tableWv').showCellEditor();return false;"/>
</p:contextMenu>
<h3>Exportieren der Daten</h3>
<h:commandLink>
<p:graphicImage value = "/img/icon-pdf.png" />
<p:dataExporter type = "pdf" target = "table" fileName = "Telefonbuch" />
</h:commandLink>
</p:panel>
</h:form>
Модель (Телефонбух):
public enum Gender {
MALE("Männlich"), FEMALE("Weiblich");
private String shortGender;
private Gender(String shortGender) {
this.shortGender = shortGender;
}
public String getShortGender() {
return shortGender;
}
}
@Column
@Enumerated(EnumType.STRING)
private Gender gender;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String vorname;
@Column
private String nachname;
@Column
private String telefonnummer;
@Column
private String handynummer;
@Column
private String geschaeftsstelle;
PrimeFaces Версия 6.2
JSF MyFaces, версия 2.2.12
Ява 1.8
Весенняя загрузка 2.1.2
@Selaron, извините, добавил их.
Это не минимальный воспроизводимый пример...
@Kukeltje Тогда я никогда не пойму. Я читаю это и думаю, что это нормально. Но это не так. Чего не хватает в ваших глазах?
Все, чего не хватает, описано в минимальный воспроизводимый пример. Небольшие дополнения в stackoverflow.com/tags/jsf/info. А также прочитайте idownvotedbecau.se/nomcve (пока не минусовал...)
@Kukeltje Я действительно надеюсь, что сейчас лучше. Я до сих пор не знаю, как справиться со своей проблемой.
Как я думал, сортировка была только моей плохой. Я реализовал это по-другому. Сейчас работает с LazyDataModel. Но метод все еще не вызывается. Не выделение, не удаление, не onRowEdit...
Возможный дубликат java.lang.UnsupportedOperationException: getRowData(String rowKey) должен быть реализован, когда базовый алгоритм rowKey не используется
Держу пари, вы найдете это UnsupportedOperationException
в своих журналах ;-)
@Selaron, к сожалению, вы ошибаетесь ... Я бы хотел, чтобы было исключение или журнал, чтобы объяснить мне, почему это происходит, но ничего нет. Я нажимаю кнопки или делаю что-то и жду, пока моя IDE перейдет в режим отладки, но метод не вызывается. Но я все равно попробую то, что ты мне прислал
К сожалению, тем не менее, обязательно реализовать getRowKey
и getRowData
с lazyModel и включенным выбором. Но поскольку исключение не генерируется (или просто не регистрируется?), может возникнуть дополнительная проблема.
@CptDayDreamer Уменьшите этот пример до минимального примера, который можно запустить и который выявляет рассматриваемую проблему. То есть - уменьшить модель и страницу до минимума. Я вижу ряд проблем, вам нужно реализовать rowkey и поместить свой вспомогательный компонент в правильную область, но ваш пример даже не раскрывает область действия вспомогательного компонента. Если вы сделаете это (а пример можно легко скопировать и запустить), мы сможем вам помочь.
@AdamWaldenberg Сейчас я отредактировал это снова. Я не вижу никаких проблем. Я реализовал rowKey и rowData сейчас. И добавил размах. Я ошибаюсь или у вас сейчас нет всего, что вам нужно? Все равно ничего не работает
Обновление: когда я удаляю selectionMode и selection, я, наконец, снова могу редактировать свои записи. Но проблема сейчас в том, что я хочу вызвать через contextMenu удаление строки, но это, конечно, больше не работает.
Какие версии PF и JSF вы используете? Измените свой вопрос, указав минимальный воспроизводимый пример