【发布时间】:2015-07-11 09:28:54
【问题描述】:
如果您在 Struts 2 中扩展 ValidatorSupport 类,您可以在该类中添加实例变量吗?它可以有状态还是必须是无状态的?
我知道动作类不是单例并且可以有状态,但我不确定它们关联的验证器。
我需要知道是否可以在扩展ValidatorSupport 的验证器中拥有一个实例变量。例如:
public class SomeValidator extends ValidatorSupport {
private boolean alreadyHasErrorOnPage;
}
如果验证器是 signleston,则使用 alreadyHasErrorOnPage,因为它会导致竞争条件,并且不会为每个请求/响应提供一致的默认状态。如果它们不是单例并且为每个请求/响应创建一个新的 SomeValidator 实例,那么使用 alreadyHasErrorOnPage 将是安全的。
对以下内容持保留态度,因为我不确定其中有多少与我目前正在进行的项目特别相关。
验证器是我们项目中的单身。我进去调试了应用程序,发现实例成员在第二次请求/响应后不处于默认状态。本质上,它们会继承第一个或上一个请求/响应的值。
我仍然不确定的原因是因为我们的项目似乎已经包装和 ValidatorSuppport 并暴露了我们的验证器实现的接口。在我们的代码库中,似乎有代码将验证器的实例存储在映射中,基本上使它们成为单例。我无法确定股票 struts2 的行为方式是否相同。
【问题讨论】:
-
什么种状态?例如,验证器具有存储配置的状态,例如字符串的最大/最小长度。
-
我猜是关于当前会话的状态。我不太清楚如何解释。我们的验证器的工作方式是将操作的实例传递给 validate 方法。然后我们在操作上使用 getter 和 setter 来获取我们想要验证的数据。所以我想我的问题可能是它应该存储当前请求/响应的信息吗?本质上是那些单例类,或者它们是为每个请求/响应创建的实例
-
你什么时候将实例传递给验证器?我的意思是,验证器在他们的
validate方法中获取对象;它们不存储在验证器本身中。我不清楚你想做什么,但我很怀疑。无论如何,测试起来很容易,对吧?我不记得了,但如果它们是按请求创建的,我会感到惊讶。 -
@DanKing 我觉得这很有趣,但您能否详细说明您为什么需要这些信息以及它将如何影响您开发的软件?
-
@RomanC 我用一些关于它为什么重要的信息编辑了这个问题。我找到了与我的项目相关的答案,但我仍然不确定这是默认的 struts2 行为还是对我们如何实现验证器的副作用。
标签: java validation struts2 xwork