0

我遇到了一个奇怪的问题/错误,在任何地方都找不到有效的解决方案......

情况是:我有一个 Spring Web Flow 调用一个视图状态,其中包含一个显示对象列表的数据表,每个对象旁边都有一个“编辑”按钮。

这是 SWF 的样子:

<?xml version="1.0" encoding="UTF-8"?>    
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
parent="parent-flow" start-state="home">

<persistence-context />

<var name="myObject" class="com.domain.MyObject" />

<view-state id="home">
    <on-render>
        <evaluate expression="myObjectService.findAll()"
            result="viewScope.myObjectList" result-type="dataModel" />
    </on-render>
    <transition on="edit" to="editMO" />
    <transition on="search" to="home" />
</view-state>

<subflow-state id="editMO" subflow="myObject/addEdit">
    <input name="myObject" required="true" />
    <transition to="end" />
</subflow-state>

<end-state id="end"
    view="externalRedirect:servletRelative:/home" />

</flow>

一些解释:

1)“MyObject”类是一个简单的pojo,带有一些属性和一个用于持久化的实体注释。

2)“myObjectService.findAll()”给了我所有存储的“MyObject”的列表。

现在这里是视图代码(使用模板standard.xhtml):

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    template="/WEB-INF/layouts/standard.xhtml">

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

    <ui:define name="content">
        <h:form>
                <div>

                    <p:dataTable id="tbl" value="#{myObjectList}" var="item">
                        <f:facet name="header">Result list</f:facet>
                        <p:column>
                            <f:facet name="header">Name</f:facet>#{item.name}
                        </p:column>

                        <p:column>
                            <f:facet name="header">Description</f:facet>#{item.description}
                        </p:column>

                        <p:column>
                            <f:facet name="header">Whatever</f:facet>#{item.whatever}
                        </p:column>

                        <p:column>
                            <f:facet name="header">Actions</f:facet>
                            <p:commandButton value="Edit" action="edit" icon="ui-icon-edit">
                                <f:setPropertyActionListener value="#{item}"
                                    target="#{myObject}" />
                            </p:commandButton>
                        </p:column>
                    </p:dataTable>
                </div>
            </p:panel>
        </h:form>
    </ui:define>

</ui:composition>

当我单击“编辑”按钮之一时,跟踪告诉我视图正在重新呈现,但动作/事件“编辑”从未被触发、检测到或在任何地方捕获(至少我知道)。

有趣的是:如果我将对服务的调用(以加载对象列表)从 Flow 移动到视图内的 dataTable“值”属性,如下所示:

<p:dataTable id="tbl" value="#{myObjectService.findAll()}"

一切正常!但后来我在每个渲染事件(最多看到十一个......)上都有很多调用,这显然是我不想要的。

我看到很多关于我的问题的主题的帖子,但没有一个可以解决它(试图将流重定向属性“redirect-in-same-state”更改为 false,强制惰性关闭,更改组件和变量的范围,强制服务或支持 bean 的范围,等等......)

所以,既然我的想法已经用完了,我想我会在这里试一试。有人有想法吗?

4

2 回答 2

0

好吧,这个问题是很久以前提出的,但我现在面临同样的问题。所以这就是我发现的。

最后一个 SWF Booking-faces (Web Flow: 2.4.0.M1) 示例有同样的问题。

在“main-flow.xml”它定义:

<view-state id="enterSearchCriteria">
    <on-render>
        <evaluate expression="bookingService.findBookings(currentUser?.name)" **result="viewScope.bookings"** result-type="dataModel" />
    </on-render>
    <transition on="search" to="reviewHotels"/>
    <transition on="cancelBooking">
        <evaluate expression="bookingService.cancelBooking(bookings.selectedRow)" />
    </transition>
</view-state>

在“enterSearchCriteria.xhtml”中,它声明了一个<p:dataTable>迭代预订的 a。dataTable 具有此列定义:

<p:column>
    <f:facet name="header">Action</f:facet>
    <p:commandButton id="cancel" value="Cancel" action="cancelBooking" update=":bookings"/>
</p:column>

当您单击取消按钮时,没有任何反应。我可以通过查看视图重新呈现的跟踪来看到,但从未调用方法“bookingService.cancelBooking(bookings.selectedRow)”。

但是,如果我将“bookings”变量的范围更改为“conversationScope”,它会起作用:

<view-state id="enterSearchCriteria">
    <on-render>
        <evaluate expression="bookingService.findBookings(currentUser?.name)" **result="conversationScope.bookings"** result-type="dataModel" />
    </on-render>
    <transition on="search" to="reviewHotels"/>
    <transition on="cancelBooking">
        <evaluate expression="bookingService.cancelBooking(bookings.selectedRow)" />
    </transition>
</view-state>

这是 viewScope/flowScope 的错误吗?

于 2013-11-12T12:44:28.083 回答
0

尝试将immediate="true"属性添加到commandButton. 这使按钮优先于验证,并且应该处理该操作。

于 2014-10-22T15:30:22.483 回答