7

Apache Tiles 2.1.3 具有通配符功能,其中切片定义包含星号:

<definition name="flow/*" extends=".mainTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>

这里有解释,但基本上这种布局用于“流”目录中的任何 JSP。

问题是 Spring Webflow 使用 Tiles 产生了无限递归:

org.springframework.webflow.execution.FlowExecutionException: Exception thrown in state 'createAccount' of flow 'jsp/flow'
Caused by: java.lang.IllegalStateException: Exception occurred rendering view null
Caused by: java.lang.NullPointerException

我最终插入了许多单独的 Tiles 定义,而不是一个通配符定义(在此处插入皱眉脸)。

Tiles 通配符如何与 Spring WebFlow 一起使用?

4

1 回答 1

6

简单的修复:您不能使用带有通配符的默认 Web Flow 视图名称,因为您不能像这样创建通配符 Tiles 定义:

<definition name="*" extends=".flowTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>

如果您提供这样的纯“*”定义,Tiles 系统将进入(看似)无限循环:

name="*" 

这样做的方法是提供这样的定义:

<definition name="flow/*" extends=".flowTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>

然后将您的 Web Flow 视图名称强制为该表单,如下所示:

<view-state id="myView" model="myView" view="flow/myView">
    <transition on="back" to="previousView" />
    <transition on="next" to="nextView" />
</view-state>

默认视图名称是视图 ID,在本例中为“myView”。您不能为视图提供“flow/myView”的 id,但您可以单独指定视图名称

view="flow/myView"

这会将正确的值提供给 Tiles 解析器。我确信 Tiles 视图命名和 Web Flow 视图分辨率还有其他问题,但这解决了我的问题。

请务必引用正确的 URL(即,酌情注入“flow/”)。

于 2013-08-27T19:07:29.340 回答