404-not found
这个问题当初花了很长时间。
在解决掉版本问题带来的异常,起了服务器之后,输入进入流程的url,发现提示404,找不到页面。
寻找方法
一开始想的肯定是路径问题。检查了一下路径,确实没有问题, 并且把state中绝对路径和相对路径都试了一遍,结果还是404。
查日志,开发期间使用的是maven自带的jetty服务器,配置日志显得特别麻烦,最后没有从日志中找到有用的信息。
检查相关配置。我是通过spring in action这本书使用webflow,当时担心可能是流程注册表等一些配置的问题,仔细检查一遍,没有问题。
有了线索,检查shiro。突然想到有可能是因为权限,因为我在测试的时候都没有登录,之前将webflow的url定义为不需要权限。我发现,我随便定义几个不需要权限的无意义的url都是会出来404的。也就是说,既不是shiro的问题,也不是webflow的问题。
找到问题!既然不是webflow的问题,那问题只能又一次出现在整合上面了。再次到stackoverflow上查,终于找到了问题的所在。原来当spring mvc和spring webflow整合的时候,DispatcherServlet在使用mvc的ViewResolver解析url时,如果已经配置的resolver解析不了这个url,它是不知道解析来使用webflow的解析器的。这是个bug,该问题已经报告issue。解决方法有两个。我使用了第一个。
解决方案:
将webflow的resolver强行更改顺序,只需要将它的order属性更改为-1, spring mvc当然会优先考虑webflow的解析器了。基本上都这么配置。
<!-- 定义流程专用的HandlerMapping以及HandlerAdapter -->
<!-- 将请求定向到Spring web flow -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry"/>
<property name="order" value="-1"/>
</bean>
<!-- 处理请求web flow -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
另一种解决方法:
当时下面还有一个人提出了另外一种方法,那就是使用两个DispatcherServlet,我没有尝试,目测可行,一个配给mvc,一个配给webflow。