2017-10-07 29 views
0

我们有一个Spring管理的Struts 2应用程序正在运行,其中之前的开发人员在Action类中存储了HttpServletRequest对象在全局变量中。 做了一些研究之后,我发现默认情况下Struts Action类是线程安全的,因为它们是为每个请求实例化的,但在我们的应用程序中,Struts Action类被配置为Spring bean而没有提及bean作用域(所以默认情况下它们是单例) 。我认为这是一个灾难的原因,所以我正在寻找一个修复,我发现在官方的Struts以下2以下Spring集成例如:什么应该是由Spring管理的Struts 2 Action类bean的合适范围?

<bean id="editService" class="org.apache.struts.edit.service.EditServiceInMemory"/> 

<bean id="editAction" class="org.apache.struts.edit.action.EditAction" scope="prototype"> 

    <property name="editService" ref="editService" /> 

</bean> 

这里的范围被设定为原型,但我的东西它应该是请求,因为动作类需要为每个Http请求实例化。请告诉我,我的理解是否正确以及是否是正确的解决方案,而不是将请求对象实例化为局部变量。

我找到了在堆栈溢出以下问题,但我想在Struts 2中的常用词汇: Spring Request and Prototype Scope?

+0

[Spring Request and Prototype Scope?](https://stackoverflow.com/questions/6480005/spring-request-and-prototype-scope)可能有重复。我认为,这几乎告诉你你想知道什么。通过请求作用域,您将在httprequest的生命周期中获得相同的bean实例。所以这取决于你的用例:就像你有你想要共享状态的行为一起过滤。 –

+0

嗨罗伯特,这个问题回答了请求和原型bean之间的区别,但我想知道在struts托管的web应用程序中,请求和原型之间应该是什么样的正确范围。 –

+0

@RobertMoskal:我们没有过滤器,但是我们正在从请求中提取数据并在动作类中进行安全检查。根据我的理解,实例化的正确方法是在请求范围内声明操作类,但在官方文档中将其作为原型给出,这是我的困惑。 –

回答

0

这篇文章解释了相当清楚如何两项工作:Spring Request and Prototype Scope?

我会说,如果你的应用只使用简单的动作,你使用的并不重要。如果您使用过滤器或struts拦截器,并且希望在请求管道的不同步骤之间保持状态,则必须使用请求范围的bean。否则它再次没有关系。

我可能会使用基于原型的bean,当基于请求的bean不是绝对必要时。

+0

谢谢罗伯特!实际上,我们有一个父抽象动作类,其中声明了全局请求变量,并由应用程序中的所有动作类扩展和实现。我们只在不同的操作类之间共享状态(请求对象),这些操作类引用了在父操作类中全局声明的单个请求对象。所以我的理解是,为了解决这个问题,动作bean应该在请求范围内声明,因为请求状态是由一系列操作类共享的。 –

+0

它有一个类层次结构,那么你实际上只有一个实例化的类,而不是一个链,所以我仍然认为你不需要使用请求作用域bean,但是如果你这样做,没有什么坏处。 –

+1

@RobertMoskal你为什么说'没有伤害,如果你'?当您使用也是数据bean的Struts2控制器的请求范围时,您从不知道灾难,但是控制器本身。 –

相关问题