2012-04-27 68 views
0

我试图确保当一个动作被调用时,给出了期望的参数(如显示用户配置文件我想确保参数包含用户ID:viewUser.action?userId = 1 should工作很好,但viewUser.action应该重定向到一个错误页面)struts2准备和验证

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

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

所以我的问题是: 我是否应该使用prepare()方法中的参数?有没有其他方法可以解决这个问题?

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

回答

1

使用“paramsPrepareParamsStack”拦截器堆栈。

+0

所以我会有params => prepare => params =>验证。但是如果idUser为空,我仍然会在使用idUser时遇到问题。 – Estragon 2012-04-27 09:30:11

+0

@Estragon你不能检查它是否为空?或者你使用它的业务逻辑没有做任何理智检查? – 2012-04-27 10:06:58

+0

当然,我检查所有的输入,但我不相信准备是检查的地方,验证系统应该更好,手动检查准备/业务功能...另外我真的不知道如何反应,如果参数为null准备 – Estragon 2012-04-27 10:09:41

0

你可以改变你的struts-default.xml中的文件的拦截器默认顺序,所以复选框,而params拦截器会开始前准备拦截。

<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> 

但我不喜欢这个主意。我的事情更好的办法是改变你的行动逻辑和,如果他们使用的一些参数准备功能删除代码的所有部分。为什么你做的它在“准备”?你想在验证过程中使用结果?

+0

'prepareParamsPrepareStack'已经存在用于此目的;为什么要自己做?除此之外,OP已经表明,切换拦截器命令不管出于什么原因都是不可取的。 – 2012-04-27 10:14:53

+0

啊,你的意思是paramsPrepareParamsStack?是的,这是更好的解决方案。 – 2012-04-27 10:43:12

+0

哎呀,是的 - 让他们倒退了,我必须在30分钟内忘记了;) – 2012-04-27 10:44:01

0

接下来是关于如何避免这个问题的解释,并简化了所有的开发过程,但最直接的解决方案当然是Daves。我肯定会首先实现这一点,并在未来使用该问题。

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

一般动作类负责以下:

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

这你知道,你也知道,准备是关于让有些人虽然不喜欢的东西打开了要执行的操作(理想情况下的服务对象所需的对象DB连接)。实际的做法应该仅限于执行方法。

与理想的路线一样,使用注入您选择的DI提供者(Spring/Guice)的服务对象,我们发现自己几乎没有理由需要准备方法。我们的行动变得更小,更容易理解,因此更容易进行测试。