我试图确保在调用操作时,给出了预期的参数(比如显示用户配置文件,我想确保参数包含用户ID:viewUser.action?userId = 1应该运行良好但是viewUser .action应重定向到错误页面)
所以我创建了一个验证xml,它指定userId字段不能为null。一切正常。
但是现在,在prepare()上,我使用userId做了一些前期工作。 事实是,在验证拦截器之前调用了准备拦截器,所以如果userId为null,那么我有一个很好的nullPointerException,并且因为错误发生之前没有调用验证。 我知道我可以切换拦截器顺序,但我不想。
所以我的问题是: 我应该在prepare()方法中使用参数吗?还有其他方法可以解决这个问题吗?
谢谢,抱歉我的英语不好:(
答案 0 :(得分:1)
使用“paramsPrepareParamsStack”拦截器堆栈。
答案 1 :(得分:0)
您可以更改struts-default.xml文件中拦截器的默认顺序,因此复选框和参数拦截器将在准备拦截器之前启动。
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
但我不喜欢这个想法。我更好的方法是更改你的动作逻辑,如果他们使用一些参数,从prepare函数中删除所有代码部分。为什么你这样做“准备”?您想在验证期间使用结果吗?
答案 2 :(得分:0)
以下是关于如何避免此问题并使所有开发更容易的解释,但最直接的解决方案肯定是Daves。我肯定会首先实现这个问题并完成该问题并在将来使用以下内容。
根据我的经验,prepare()用于获取服务,这些服务将使操作完成它的工作,这是最好的依赖注入(Spring)服务。
通常,action类负责以下事项:
您知道并且您也知道准备是关于获取执行操作所需的对象(理想情况下是服务对象,尽管有些人会执行诸如打开数据库连接之类的操作)。实际操作应限于execute方法。
使用理想的路线,即使用您选择的DI提供者注入的服务对象(Spring / Guice),我们发现自己几乎没有理由需要准备方法。我们的行动变得更小,更容易理解,更容易测试。