Primefaces Lazytable, использующий один Bean для разных критериев фильтрации

У меня есть Bean, который возвращает «Заметки» для разных объектов. Например. У меня могут быть примечания для предложений, клиентов, счетов и т. д.

Вместо того, чтобы создавать много bean-компонентов для разных объектов, я хочу иметь один Bean-компонент, который возвращает правильные примечания для каждого объекта. Я отправил на свою страницу JSF две информации "entityType" и "objectId" в компонент. С помощью этих двух параметров я могу отфильтровать свои данные в bean-компоненте.

В настоящее время у меня есть следующий код, в этом примере для «ПРЕДЛОЖЕНИЕ»:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:pe="http://primefaces.org/ui/extensions"
    template="/WEB-INF/layout/portal/template.xhtml"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">

    <ui:define name="head" />
    <ui:define name="title">Page</ui:define>

    <ui:define name="content">


        <p:growl id="growl" showDetail="false" sticky="false" life="3000" />

        <div class="ui-g">
            <div class="ui-g-12">
                <div class="card card-w-title">


                    <p:tabView id="offerTab" dynamic="true" cache="false"
                        widgetVar="tabPanel">


                        <p:tab id="note"
                            disabled="#{offerEditController.modeOffer eq 'ADD'}">

                            <f:facet name="title">
                                <i class="fa fa-sticky-note Fs12 MarRight40"></i>
                                <h:outputText value=" Notizen" />
                            </f:facet>

                            <div class="EmptyBox10"></div>


                            <p:outputPanel id="notePanel">
                                <div class="ui-g ui-fluid">


                                    <div class="ui-g-12 ui-lg-5">

                                        <h:form id="noteForm"
                                            rendered="#{noteRequestByObjectController.init('OFFER', offerEditController.offer.id, offerEditController.offer.idHash)}">


                                            <p:dataTable id="noteListDatatable"
                                                value="#{noteRequestByObjectController.lazyModel}"
                                                var="note" widgetVar="noteTable" resizableColumns="false"
                                                multiViewState="false" selectionMode="single"
                                                selection="#{noteRequestByObjectController.selectedNote}"
                                                filteredValue="#{noteRequestByObjectController.filteredNote}"
                                                rows="50" pageLinks="10" paginatorPosition="bottom"
                                                lazy="true" paginator="true" reflow="true"
                                                currentPageReportTemplate="(Eintrag: {startRecord}-{endRecord} von {totalRecords}, Seite: {currentPage} von {totalPages})"
                                                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                                rowsPerPageTemplate="50,100,200"
                                                paginatorAlwaysVisible="false"
                                                emptyMessage="Kein Eintrag gefunden">


                                                <f:facet name="header">

                                                    <p:outputPanel id="functionalityPanel"
                                                        style="float:left; margin-top: -3px">

                                                        <p:commandButton value="Neu hinzufügen"
                                                            styleClass="green-btn White" icon="fa fa-plus-circle"
                                                            actionListener="#{noteRequestByObjectController.doCreateNew}"
                                                            update=":offerTab:noteForm:noteListDatatable, :offerTab:addNoteForm"
                                                            resetValues="true" ajax="true">
                                                        </p:commandButton>

                                                    </p:outputPanel>

                                                    <h:outputText id="overviewText"
                                                        value="Übersicht (#{noteRequestByObjectController.numberTotal})" />
                                                    <p:tooltip for="overviewText" position="top"
                                                        value="Die Gesamtzahl der Filterung" />


                                                </f:facet>


                                                <p:ajax event="rowSelect" ajax="true" immediate="true"
                                                    resetValues="true"
                                                    listener="#{noteRequestByObjectController.onSelectNote}"
                                                    update=":offerTab:noteForm, :offerTab:addNoteForm" />


                                                <p:column sortBy="#{note.createDate}" visible="true">

                                                    <f:facet name="header">
                                                        <h:outputText value="Create" />
                                                    </f:facet>


                                                        <h:outputText id="createDateInfo"
                                                            style="margin-left: 5px;" value="#{note.createDate}"
                                                            styleClass="Fright">
                                                            <f:converter converterId="prettyTimeCustomConverter" />
                                                        </h:outputText>


                                                </p:column>

                                            </p:dataTable>
                                        </h:form>
                                    </div>

                                </div>

                            </p:outputPanel>

                            <div class="EmptyBox20"></div>

                        </p:tab>

                    </p:tabView>

                </div>

            </div>
        </div>



    </ui:define>

My Bean: - Contains the init function and the function for loading the Notes from Database:

   @ViewScoped
@Named
public class NoteRequestByObjectController extends LazyDataModel<Note>
        implements SelectableDataModel<Note>, Serializable {

    private static final long serialVersionUID = 2815796004558360299L;
    private final Logger LOGGER = LoggerFactory.getLogger(NoteRequestByObjectController.class);

    @EJB
    private NoteService noteService;

    @Inject
    private LoginBean loginBean;

    private List<Note> filteredNote;
    private List<Note> selectedNoteList = new ArrayList<Note>();
    private LazyDataModel<Note> lazyModel;
    private List<Note> list;

    private Note selectedNote;
    private List<Boolean> toogleList;
    private List<ObjectForSearchList> searchList = new ArrayList<ObjectForSearchList>();
    private int numberTotal = 0;

    public enum ModeNote {
        EDIT, ADD
    };

    private ModeNote mode;

    private String entityType;
    private String visibleType;
    private Long objectId;
    private String objectIdHash;

    private boolean startLoad = false;

    /**
     * Init
     */
    public boolean init(String currentEntityType, Long currentObjectId, String currentObjectIdHash) {

        try {

            entityType = currentEntityType;

            objectId = currentObjectId;
            objectIdHash = currentObjectIdHash;

            if (objectId == null || objectIdHash == null)
                return true;

            lazyModel = null;

            // SearchList
            initSearchList();

            findNote();

            selectedNote = new Note();
            mode = ModeNote.ADD;
            startLoad = true;

            LOGGER.info("END init");
            return true;
        }

        catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }

        return false;
    }

    /**
     * Die eigentliche Suche
     */
    public void findNote() {

        LOGGER.info("START findNote");

        lazyModel = null;

        if (lazyModel == null) {
            lazyModel = new LazyDataModel<Note>() {

                @Override
                public List<Note> load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder,
                        Map<String, Object> filters) {

                    try {
                        list = noteService.findAllNoteLazyLoading(searchList, startingAt, maxPerPage, sortField,
                                sortOrder, filters);

                        numberTotal = noteService.countNoteRowsLazyLoading(searchList);
                        lazyModel.setRowCount(numberTotal);
                    } catch (NoteNotFoundException e) {
                        lazyModel.setRowCount(0);
                        numberTotal = 0;
                    } catch (Exception e) {
                        lazyModel.setRowCount(0);
                        numberTotal = 0;
                    }
                    return list;
                }

                @Override
                public Note getRowData(String rowKey) {
                    if (list != null && !list.isEmpty())
                        for (Note note : list) {
                            String s = "Note [id=" + note.getId() + "]";
                            if (s.equals(rowKey))
                                return note;
                        }
                    return null;
                }

                @Override
                public Object getRowKey(Note note) {
                    return note;
                }
            };

        }
    }

Код работает, и я получил для каждого отдельного объекта и его идентификатора правильные примечания для этого объекта.

Но моя проблема в том, что если я посмотрю в журнале. Функция init() вызывается несколько раз. Есть ли какое-либо возможное решение для этого сценария, чтобы избежать множества компонентов для каждого объекта (клиент, предложение, счет-фактура и т. д. и т. д.)

Большое спасибо


person vished2000    schedule 06.03.2020    source источник
comment
Как насчет создания карты с LazyDataModel значениями?   -  person Jasper de Vries    schedule 06.03.2020
comment
Как заявляет Ареус, ваш визуализированный атрибут вызывает этот метод несколько раз, возможно, лучше привязать истинное или ложное значение к переменной, которая хранит значение из метода... затем в получателе этой переменной просто спросите, пересчитывается ли ее нуль это... иначе просто верните переменную..   -  person BugsForBreakfast    schedule 06.03.2020


Ответы (1)


У вас есть свой метод инициализации для атрибута rendered формы, поэтому каждый раз, когда JSF оценивает, нужно ли визуализировать форму, он вызывает метод инициализации.

Вы можете поместить свой метод инициализации в viewAction, что-то вроде этого:

<f:view ....>

    <f:metadata>
        <f:viewAction action="#{noteRequestByObjectController.init('OFFER', offerEditController.offer.id, offerEditController.offer.idHash)}"/>
    </f:metadata>
person areus    schedule 06.03.2020
comment
Может быть идея ... Я пробовал, чем на вкладке «История» в TabView Primefaces, но функция не вызывается в bean-компоненте ... ‹p: tab id = history_field disabled = # {offerEditController.modeOffer eq 'ADD' }› ‹f:facet name=title› ‹i class=fa fa-clock-o Fs12 MarRight40›‹/i› ‹h:outputText value= Historie /› ‹/f:facet› ‹f:view› ‹f: metadata› ‹f:viewAction action=#{activitiesRequestByObjectController.init('OFFER', offerEditController.offer.id)} /› ‹/f:metadata› ‹/f:view› - person vished2000; 06.03.2020
comment
Тег f:view должен включать все ваше представление, поместите его как дочерний элемент html. - person areus; 06.03.2020
comment
Не уверен, что вы имеете в виду под включением всех ваших взглядов? - person vished2000; 06.03.2020
comment
Хм, я использую на странице контента: ‹?xml version=1.0 encoding=UTF-8?› ‹ui:composition xmlns=w3.org/1999/xhtml xmlns:ui=java.sun .com/jsf/facelets xmlns:f=java.sun.com/jsf/core< /а> - person vished2000; 07.03.2020
comment
кто-нибудь может помочь? - person vished2000; 18.03.2020