数据中嵌套元素的 JSF getRowData table

JSF getRowData on nested element in data table

我正在使用 JSF 开发一个应用程序来管理我公司各个办公室的人员进行的旅行。 (我会尽量将代码保持在最低限度)

我有一个对象 Trip、一个对象 Office 和一个辅助对象 OfficeWithTrips:

public class Trip {
    private BigDecimal id;
    private BigDecimal officeId;        
    // getters and setters
}

public class OfficeWithTrips {
    private Office office;
    private DataModel<Trip> trips;
    // getters and setters
}

该应用程序有两个页面:一个是每个经理可以看到他必须管理的办公室和每个办公室的行程,另一个是单次行程的详细信息。

我有一个会话 bean,其中包含办公室及其行程的列表:

public class TripsListBean implements Serializable {
    private DataModel<OfficeWithTrips> officesWithTrips;    
    private Trip currentTrip = new Trip();
    // getters and setters
}

在主页上,我浏览了 bean 中的 "offices",它有一个嵌套的 Trips 列表。每个办公室 table 及其旅行列表都有一个带 "add new trip" 按钮的页脚。

<h:dataTable value="#{tripsListBean.officesWithTrips}" var="officeWithTrips">           
    <h:column>
        <h:form id="tripForm">
            <h:dataTable value="#{officeWithTrips.trips}" var="trip">
                <f:facet name="header">
                    <h:panelGrid columns="2">
                        <h:outputText value="Trips for the office: " />
                        <h:outputText value="#{officeWithTrips.office.name}" />
                    </h:panelGrid>
                </f:facet>
                <f:facet name="footer">
                    <h:commandButton value="Add new trip"
                        action="#{tripsHandler.addTrip}" />
                </f:facet>
                <h:column>
                    <f:facet name="header">Trip date</f:facet>
                    <h:outputText value="#{trip.date}">
                        <f:convertDateTime type="date" pattern="dd.MM.yyyy" />
                    </h:outputText>
                </h:column>
                // other columns
                <h:column>
                    <h:commandButton value="edit"
                            action="#{tripsHandler.editTrip}">
                        <f:setPropertyActionListener target="#{tripsHandler.currentTrip}"
                                value="#{trip}" />
                    </h:commandButton>
                </h:column>
            </h:dataTable>
        </h:form>
    </h:column>
</h:dataTable>

当我点击"add new trip"时,我希望能够在行程中设置office id。我在 "addTrip()" 方法中所做的是这样的:

public String addTrip() {
    OfficeWithTrips officeWithTrips = tripsListBean.getOfficesWithTrips().getRowData();
    Trip trip = new Trip();
    trip.setOfficeId(officeWithTrips.getOffice.getId());   
    tripsListBean.setCurrentTrip(trip);
    return TRIP_DETAIL_URL;
}

我的问题是,在 addTrip 中,officesWithTrips 中的索引始终为 0,当我想将行程添加到列表中的第二个办公室时,它不起作用(它总是 returns 第一个办公室) .

谁能找出错误?我 猜测 当我单击 "add new trip" 按钮时,这会在 officeWithTrips.trips 数据模型中设置索引,但不会在 tripsListBean.officesWithTrips...

我用另一个 setPropertyActionListener 解决了这个问题:我在 TripsListBean 中添加了一个 Office currentOffice,并直接在 jsf 页面上用 setPropertyActionListener 设置了它。基本上,我为 currentTrip

做的一样