Spring Webflow:如何跟踪持久化的实体ID?

问题描述

| 我正在开发Webflow(SWF2)。实体是使用Roo生成的。可以多次调用其中一个webflow视图multi-instance.jspx,以允许同一实体(MyClass)的多个持久化实例。 我想保留这些持久化实体的列表,以便在以后的流程中引用它们。到目前为止,我已经尝试了以下方法。 我的
flow.xml
的简化版本如下所示:
<on-start>
    <evaluate expression=\"new java.util.ArrayList()\" result=\"flowScope.myList\" result-type=\"java.io.Serializable\"/>
</on-start>

<view-state id=\"multi-instance\" view=\"multi-instance\" model=\"myClass\">
    <binder>
        <binding property=\"field1\"/>
        <binding property=\"field2\"/>
    </binder>
    <on-entry>
        <evaluate expression=\"new com.test.MyClass()\" result=\"flowScope.myClass\" />
    </on-entry>
    <transition on=\"another_instance\" to=\"multi-instance\"/>
    <transition on=\"success\" to=\"confirm\"/>
    <transition on=\"cancel\" to=\"abort\"/>
    <on-exit>
        <evaluate expression=\"myClass.persist()\"/>
        <evaluate expression=\"flowScope.myList.add(myClass)\"/>
    </on-exit>
</view-state>
confirm
abort
的视图状态也在
flow.xml
中定义。
confirm.jspx
看起来像这样:
<div xmlns:spring=\"http://www.springframework.org/tags\" xmlns:c=\"http://java.sun.com/jsp/jstl/core\" xmlns:fn=\"http://java.sun.com/jsp/jstl/functions\" xmlns:form=\"http://www.springframework.org/tags/form\" xmlns:util=\"urn:jsptagdir:/WEB-INF/tags/util\" xmlns:jsp=\"http://java.sun.com/JSP/Page\" version=\"2.0\">
<jsp:directive.page contentType=\"text/html;charset=UTF-8\" />
<jsp:output omit-xml-declaration=\"yes\" />
<form:form>
    <c:forEach items=\"${myList}\" var=\"instance\">
        <li>${instance.getField1()} ${instance.getField2()}</li>     
</c:forEach>
    <div class=\"submit\">
        <input type=\"submit\" id=\"success\" name=\"_eventId_success\" value=\"success\"/>
        <input type=\"submit\" id=\"cancel\" name=\"_eventId_cancel\" value=\"cancel\" />
    </div>
</form:form>    
</div>
因此,问题来了: 每当我打到“ 5”时,Web返回就会说org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap(FlowExecutionImpl.java:569)抛出异常。 编辑:Apache日志更具启发性。以下是调用堆栈顶部的代码段:
SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: 
/WEB-INF/views/myflow/confirmation.jspx(6,7)
The function getField1 must be used with a prefix when a default namespace is not specified
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
我不确定ArrayList方法是否可行;我相信我在某个地方读到了flowScope.myClass实例,它是在“ 9”状态下定义的,已由GC接收或至少不在范围内。我不确定。如果有人可以就该特定主题提供一些启示,我会很高兴。 (如果您碰巧知道保留这些持久性实体列表的更好方法,请随时让我知道!)预先感谢! :) 更新: 我能够像这样计算列表中的元素数量
<c:choose>
    <c:when test=\"${myList != null}\">myList exists,it contains <c:out value=\"${fn:length(myList)}\" /> items!</c:when>
    <c:otherwise>myList doesn\'t exist.</c:otherwise>
</c:choose>
显示的元素数与我插入的元素数相同。但是,当我这样做时:
<c:forEach items=\"${myList}\" var=\"instance\">
    <c:if test=\"${instance != null}\">
        <li>${instance.field1} ${instance.field2}</li>
    </c:if>
</c:forEach>
什么都不显示。 (当省略null测试时,我可以确认
  • 元素的数量正确。另外请注意,我正在尝试直接访问属性,如此处所示:jstl / jsp-遍历向量对于这里的范围,我不知道要怎么想,但是很明显我无法通过ArrayList访问我的实体。     

    解决方法

            首先,关于变量作用域的问题,我建议您查看SWF文档的4.4节,其中描述了所有不同的可用范围。 流作用域变量在流的整个生命周期中均有效。因此,您的myClass变量在流退出之前不会消失。但是请记住,每次进入视图状态时,您的
    <on-entry>
    表达式都会分配一个新实例。 其次,我认为您的解决方案可能正处于正确的轨道上。我会注意几件事: 您正在坚持并在
    <on-exit>
    元素中添加到列表中-这意味着当您离开状态时,包括在进行
    cancel
    过渡时,这两种情况将始终发生。这可能不是您想要的。有关: 您的
    <transition on=\"another_instance\" to=\"multi-instance\"/>
    实际上正在退出视图状态并重新进入视图状态,从而触发
    <on-exit>
    <on-entry>
    逻辑。只需执行
    <transition on=\"another_instance\">
    ,就可以保持相同状态。这样做将执行转换中的所有逻辑,然后重新渲染视图,而无需实际更改状态。 您可能要考虑使用
    <var>
    标记来初始化变量...对
    <evaluate expression=\"new ...\"/>
    所做的工作有效,但使用
    <var>
    可能更干净。另外,也不必说“ 22”。当需要将返回类型转换为elese时,应使用23ѭ。 最后,您收到的错误看起来与Webflow无关。 JSTL / EL允许您访问bean属性,但不能访问方法,并且您正在尝试调用方法。有关更多信息,请参见此问题。