0

我试图确保在调用操作时给出预期的参数(比如显示用户配置文件我想确保参数包含用户 ID:viewUser.action?userId=1 应该可以正常工作,但 viewUser.action 应该重定向到错误页面)

所以我创建了一个验证 xml,指定 userId 字段不能为空。一切正常。

但是现在,在 prepare() 上,我使用 userId 做了一些前期工作。事实是,在验证拦截器之前调用了准备拦截器,因此如果 userId 为 null,那么我有一个很好的 nullPointerException 并且不会调用验证,因为之前发生了错误。我知道我可以切换拦截器顺序,但我不想。

所以我的问题是:我应该在 prepare() 方法中使用参数吗?还有其他方法可以处理吗?

感谢和抱歉我的英语不好:(

4

3 回答 3

1

使用“paramsPrepareParamsStack”拦截器堆栈。

于 2012-04-27T09:14:43.963 回答
0

以下是关于如何避免此问题并使所有开发更容易的解释,但最直接的解决方案无疑是 Daves。我肯定会首先实施该问题并解决该问题并在将来使用以下内容。

根据我的经验,prepare() 用于获取服务,这将使操作完成它的工作,这最好由依赖注入(Spring)提供。

通常,动作类负责以下内容:

  • 获取执行操作所需的对象(服务对象)。
  • 获取执行操作所需的参数(服务对象用于获取我们需要的参数)。
  • 验证参数是有意义的(验证方法/注释,可以外部化到 xml)。
  • 执行操作(使用前面提到的服务对象)。
  • 获取视图所需的对象...

您知道这一点,并且您还知道准备是关于获取执行操作所需的对象(理想情况下是服务对象,尽管有些人会做诸如打开数据库连接之类的事情)。实际做的应该仅限于执行方法。

采用理想的路线,即使用通过您选择的 DI 提供者(Spring/Guice)注入的服务对象,我们发现自己几乎没有理由需要 prepare 方法。结果,我们的动作变得更小、更容易理解和更容易测试。

于 2012-04-28T21:40:54.920 回答
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>

但我不喜欢这个主意。我认为更好的方法是更改​​您的操作逻辑并从准备函数中删除所有代码部分(如果它们使用某些参数)。为什么你在“准备”中这样做?您想在验证期间使用结果吗?

于 2012-04-27T10:11:52.913 回答