Spring Webflow 2.4.2缺少启动状态

时间:2015-11-02 02:54:23

标签: spring spring-mvc spring-webflow spring-webflow-2

我刚刚开始将Webflow添加到Spring MVC项目中,并且我在我的flow.xml组件上遇到了这个编译错误:

Start state is missing. Add at least one state to the flow

我在一年前发现了一篇关于SO的相同帖子:webflow.xsd - Start state is missing. Add at least one state to the flow。 没有人回答这个问题,但我在Spring Webflow的Jira存储库中找到了它:webflow.xsd - Start state is missing. Add at least one state to the flow。它被标记为无法再现。

以下是我非常简单的webflow.xml的摘录。

    <?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.4.xsd">

    <on-start>
        <evaluate expression="recipeService.createRecipe(currentUser.name)" result="flowScope.recipe" />
    </on-start>

    <view-state id="basics" view="recipe/basics" model="recipe">
        <transition on="proceed" to="ingredients"></transition>
        <transition on="cancel" to="cancel"></transition>
    </view-state>

    ... more states ...

    <end-state id="end" view="recipe/end"/>
    <end-state id="cancel" view="recipe/end"/>

    </flow>

文档表明启动状态是可选的 - 第一个视图状态将被假定为开始。如果我将spring-webflow-2.4.xsd更改为2.0,则错误消失,但如果我尝试在任何视图状态条目上使用validation-hints,则会出现不同的错误。 &#34; Basic1&#34;和&#34; Basic2&#34;在下面的示例中是配方模型上的验证组。

<view-state id="basics" view="recipe/basics" model="recipe" validation-hints="'basic1,basic2'">

我正在使用

  • STS 3.6.4
  • Spring 4.1.6.RELEASE
  • Spring WebFlow 2.4.2.RELEASE
  • Spring Security 4.0.2.RELEASE
  • Java 1.7
  • Hibernate 4.3.10.FINAL

我使用基于java的配置来处理所有问题,但除非我在Webflow 2.4.2所要求的版本中存在不匹配,否则我不认为问题出在哪里?我可以发布我的WebMvcConfig和WebFlowConfig或pom.xml或任何其他信息,如果这将有所帮助。

非常感谢任何帮助。

编辑#1:摘自java config

    From WebFlowConfig.java: 
    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return getFlowDefinitionRegistryBuilder(flowBuilderServices())
            .setBasePath("/WEB-INF/views")
            .addFlowLocationPattern("/**/*-flow.xml")
            .build();               
    }

    From WebMvcConfig.java
    @Override
    public void addViewControllers(final ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/recipe/basics.htm");        
        registry.addViewController("/recipe/ingredients.htm");
        registry.addViewController("/recipe/instructions.htm");
        registry.addViewController("/recipe/optional.htm");
        registry.addViewController("/recipe/end.htm");
    }

使用2.0所有页面都以正确的顺序执行。

编辑#2

我忘了提到即使使用2.4 xsd编译错误,webflow也会执行,与一年前的帖子相同。我还发现了有关STS的问题:webflow config gives incorrect "Start state definition is missing." error。指示的修复版本是3.3.0.M1所以我假设(?)修复程序仍然包含在STS 3.6.4中。

3 个答案:

答案 0 :(得分:4)

我花了好几个小时尝试了我能想到的一切,包括使用来自booking-mvc示例项目的pom.xml中的内容替换pom.xml中的几乎所有内容,尽管它也没有显示此错误设置为2.4.2版。由于webflow似乎与Thymeleaf和Tiles(我没有使用)相关联,我认为在那些可以消除错误的项目中可能存在依赖关系。没有。

所以我浏览了预订-mvc项目的属性,并将它们与我的相比较。我能看到的唯一相关区别在于Spring Web流量支持。我的项目列出了我的recipe-flow.xml,但是booking-mvc没有显示它的-flow.xml文件。删除flow.xml文件后,错误消失了。

enter image description here

我不知道文件是如何在此配置位置结束的,我无法找到有关此属性的用途的任何文档,但显然它是禁止的,至少在我的项目中。我花了一段时间让我的pom.xml重新恢复状态,但应用程序现在又恢复了工作。

答案 1 :(得分:1)

以下是2.0和2.4 xsd的差异

http://diffchecker.com/oqx5rq7t

唯一的差异是增加了validation-hints属性。

不确定还能从中推断出什么。也许这是eclipse / STS的一个错误,它解析了xsd文件。

正如Rossen在SWF jira票证中指出的那样,xsd中的每个子元素都定义为minOccurs =“0”https://jira.spring.io/browse/SWF-1646

所以我认为这不是SWF问题,而是STS / Eclipse解析问题。

答案 2 :(得分:1)

我终于找到了解决方案。

Eclipse认为“缺少开始状态”因为他认为XML是“Spring Web Flow Definition File”,但他错了。 解决方案是告诉Eclipse XML不是“Spring Web Flow Definition File”。

打开“Spring Explorer”,你会发现“Web Flow”中显示的XML,右键单击并选择“Properties”,你可以看到XML在“Web Flow Support / Config Files”列表中。只需删除它。

screenshot