1

私は奇妙な行動と呼べるものを持っています。

検索用のドロップダウンがいくつかあるパネルと、結果を表示するためのデータテーブルを含むページがあります。デフォルトでは、ページが読み込まれると、PostContruct init() によって値が初期化されます。

データテーブルの更新など、問題なく検索を実行できます。

さて、私にとって困難な部分は次のとおりです。オープン/クローズ状態のチケットのリストがあります。私の検索は、Open/Closed/ALL のいずれかで実行できます。

  • デフォルトでは、データテーブルにはオープンチケットのみがロードされ、それらを選択して selectedRow 値を使用して別のページにリダイレクトできます。
  • Closed ステータスでフィルタリングすることを選択し、ボタンをクリックして検索すると、データテーブルが更新され、行を選択できますが、任意のページを開こうとすると、Bean で null ポインター例外が発生します。
  • すべてを選択すると、データテーブルが更新され、行を選択できますが、最初のページ読み込みで表示されたデータを含むページしか開くことができないため、基本的には開いている状態のチケットのみです。クローズされて開くことができないもの

私は RequestScoped Bean を使用しています。新しく追加されたデータで selectRow が機能しない問題のヒントをいくつか知りたいと思います。

    <ui:define name="content">
        <h:form id="searchForm">
            <p:panelGrid id="searchPanel" style="width: 1000px" styleClass="ticketsPanel">
                <p:row>
                    <p:column>
                        <p:outputLabel for="lstStatus" value="Status"></p:outputLabel>
                    </p:column>
                    <p:column>
                        <p:selectOneMenu id="lstStatus" value="#{ticketController.searchStatus}">
                            <f:selectItem itemValue="Open" itemLabel="Open"></f:selectItem>
                            <f:selectItem itemValue="Closed" itemLabel="Closed"></f:selectItem>
                            <f:selectItem itemValue="ALL" itemLabel="ALL"></f:selectItem>
                        </p:selectOneMenu>
                    </p:column>
                    </p:row>
                <f:facet name="footer">
                    <p:row>
                        <p:column colspan="6" style="alignment-adjust: middle">
                            <p:commandButton value="Search" action="#{ticketController.search()}" update=":searchForm:lstTicketsTable"></p:commandButton>
                            <p:commandButton value="Create" action="/tickets/createticket.xhtml?faces-redirect=true"></p:commandButton>
                            <p:commandButton value="View" action="#{ticketController.doUpdateTicket()}"></p:commandButton>
                        </p:column>
                    </p:row>
                </f:facet>
            </p:panelGrid>

<p:dataTable id="lstTicketsTable" selectionMode="single" paginator="true"
                         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {CurrentPageReport}  {RowsPerPageDropdown}"
                         rowsPerPageTemplate="10,15,50" rows="10" paginatorPosition="bottom"
                         value="#{ticketController.ticketList}" selection="#{ticketController.selectedTicket}" var="_tl" rowKey="#{_tl.number}">

                <p:column headerText="Ticket NR">
                    <p:outputLabel value="#{_tl.number}"></p:outputLabel>
                </p:column>
                <p:column headerText="Summary">
                    <p:outputLabel value="#{_tl.summary}"></p:outputLabel>
                </p:column>
                <p:column headerText="Contact From">
                    <p:outputLabel value="#{_tl.contactfrom}"></p:outputLabel>
                </p:column>
                <p:column headerText="Researcher">
                    <p:outputLabel value="#{_tl.researcher.email == null ? '' : _tl.researcher.email}"></p:outputLabel>
                </p:column>
                <p:column headerText="NSN SR">

                </p:column>
                <p:column headerText="SR / CR">

                </p:column>
                <p:column headerText="Release">
                    <p:outputLabel value="#{_tl.release}"></p:outputLabel>
                </p:column>
                <p:column headerText="Status">
                    <p:outputLabel value="#{_tl.status}"></p:outputLabel>
                </p:column>
                <p:column headerText="Age">
                    <p:outputLabel value="#{_tl.startdate}"></p:outputLabel>
                </p:column>
                <p:column headerText="Priority">
                    <p:outputLabel value="#{_tl.priority}"></p:outputLabel>
                </p:column>
            </p:dataTable>
        </h:form>
    </ui:define>

また、バッキング Bean 関数 doUpdateTicket は[View ] ボタンで呼び出される関数であり、[ Search ]はデータテーブルのリストを更新する関数です。

public void doUpdateTicket() {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    try {
        ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + this.selectedTicket.getNumber().toString());
    } catch (IOException ex) {
        Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void search() {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    if (this.searchTicketNR != null) {
        Ticket t = tjc.findTicket(Integer.parseInt(this.searchTicketNR));
        if (t != null) {
            try {
               //This works when search by ticket number only
                ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + t.getNumber().toString()); 
            } catch (IOException ex) {
                Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    } else if (this.getSearchStatus() != "ALL") {
        setTicketList(tjc.findTicketByStatus(this.getSearchStatus()));
        this.init();
    } else {
        setTicketList(tjc.findTicketEntities());
        this.init();
    }
}
4

0 に答える 0