我遇到了一个奇怪的问题/错误,在任何地方都找不到有效的解决方案......
情况是:我有一个 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 的范围,等等......)
所以,既然我的想法已经用完了,我想我会在这里试一试。有人有想法吗?