又是chain

来源:互联网 发布:cydia软件源 编辑:程序博客网 时间:2024/05/21 19:24
 

情况是这样的:有一个名称为CreateIconaction,这个action的作用是上传一个图片文件并创建一个图标,如果图标创建成功则返回SUCCESSresult code,如果由于各种原因创建失败则返回ERRORresult code,这个action返回后,会将控制权移交给同一个chain中另一个名称为ListCategoryaction,并能过javascriptalert()方法弹出一个创建成功与否的对话框。这里的chainchain interceptorchain result共同作用而成。

但当我在测试的时候上传一个6m左右大小的文件的时候,古怪的问题随之而来,创建失败的对话框适当的弹了出来,但ListCategory这个actionexecute方法并没有执行,悲哀的是,弹出js对话框由ListCategory这个action返回的页面实现的。这就是说:控制权已经移交到ListCategory了,只是ListCategoryexecute方法并没有执行,这是怎么一回事呢?查了一下log,有一条有趣的记录,意思是说:在ListCategory这个action里并没有resultINPUT这个result code对应,遍寻整个模块所属的x-work.xml文件,确实没有与INPUT这个result code对应的result,而且整个模块所有的action都没有返回INPUT的。这个INPUT到底是那里在那里返回的呢?

查了很多资料,最后在webworkwiki里发现了Workflow Interceptor的解释:

1.      If the action being executed implements Validateable, the action's Validateable#validate() validate method is called.

2.      Next, if the action implements ValidationAware, the action's ValidationAware#hasErrors() hasErrors method is called. If this method returns true, this interceptor stops the chain from continuing and immediately returns Action#INPUT

我的action是继承了ActionSupport类,而ActionSupport同是实现了Validateable的。于是当上传的文件超出了webwork设置的大小的时候(在webwork.properties里可以设置),Workflow Interceptor自动返回了INPUT

         解决方法,很简单,把chain Interceptor放到栈底,然后在CreateIcon的映射文件中增多一个INPUTresult映射,这样就可以使整个流程得到正确执行。

原创粉丝点击