1

如果你ValidatorSupport在 Struts 2 中扩展类,你可以在类上有实例变量吗?它可以有状态还是必须是无状态的?

我知道动作类不是单例并且可以有状态,但我不确定它们关联的验证器。

我需要知道我是否可以在扩展的验证器中拥有一个实例变量ValidatorSupport。例如:

public class SomeValidator extends ValidatorSupport {
    private boolean alreadyHasErrorOnPage;

}

如果验证器是 signleston,则使用 alreadyHasErrorOnPage ,因为它会导致竞争条件并且永远不会为每个请求/响应提供一致的默认状态。如果它们不是单例并且为每个请求/响应创建一个新的 SomeValidator 实例,那么使用 alreadyHasErrorOnPage 将是安全的。

对以下内容持保留态度,因为我不确定其中有多少与我目前正在从事的项目特别相关。

验证者是我们项目中的单身人士。我进去调试了应用程序,发现实例成员在第二次请求/响应后不处于默认状态。本质上,它们继承了第一个或先前请求/响应的值。

我仍然不确定的原因是因为我们的项目似乎已经包装和 ValidatorSuppport 并暴露了我们的验证器实现的接口。在我们的代码库中,似乎有代码将验证器的实例存储在映射中,基本上使它们成为单例。我无法确定股票 struts2 的行为是否相同。

4

1 回答 1

0

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

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

void validate(Object object) throws ValidationException;  

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

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

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

于 2015-07-11T09:50:34.067 回答