【问题标题】:Can classes that extend Struts2/XWork ValidatorSupport have state扩展 Struts2/XWork ValidatorSupport 的类可以有状态吗
【发布时间】: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


【解决方案1】:

他们应该有一个状态,因为状态是要验证的主体,应该在它执行之前设置为验证器。验证器实例的构建方式应与 Struts2 中的操作相同。

对象通过 validate 方法传递给Validator。它有一个签名

void validate(Object object) throws ValidationException;  

通常object 是您可以在方法实现中验证的操作实例。验证器实例是通过验证器工厂构建的。一种是使用对象工厂来构建验证器,如果有可用的注入器,则将其与容器一起注入。但是对象工厂,无论您使用什么实现,只需创建一个新实例并返回它。因此,每次您使用验证器工厂构建验证器时,都会创建新实例。然后您可能会看到Validator 具有messagemessageKeymessageParameters 等属性。这些属性定义了Validator 的状态。您可以毫无顾忌地使用自定义属性扩展 ValidatorSupport。因为每次验证都会创建验证器的新实例,所以它是线程安全的。

它可以有状态还是必须是无状态的?

它已经有一个状态,无状态 bean 没有公共属性。

【讨论】:

  • 验证器在其validate 调用中获取对象,它们并未在验证器本身上设置。
  • @DaveNewton 他们不能在验证器本身上设置一个对象,为什么?
  • 技术上你可以,但由于它已经被发送到validate 方法,我不确定你为什么想要。老实说,我不记得它们是在应用程序配置期间还是在每个请求期间实例化的;如果它是每个请求看起来像一堆开销,因为你必须重新评估验证参数。它在我要查找的事情清单上:)
  • 无论如何它必须重新评估,无论是参数还是字段,我怀疑它会有所作为。
  • 但是,重新评估验证器参数意味着重新评估配置字符串。我想,无论如何这可能是可取的,但它应该比从操作中获取命名字段(普通的堆栈查找,但仅按名称)更多的工作。我不知道,我仍然猜测它们不会在每个请求上重新创建,但这只是一个猜测。
猜你喜欢
  • 2015-05-20
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多