如果您在 Struts 2 中扩展 ValidatorSupport
类,您可以在该类上拥有实例变量吗?它可以有状态还是必须是无状态的?
我知道操作类不是单例并且可以有状态,但我不确定它们关联的 validator 。
我需要知道 validator 中是否可以有一个扩展 ValidatorSupport
的实例变量。例如:
public class SomeValidator extends ValidatorSupport {
private boolean alreadyHasErrorOnPage;
}
如果 validator 是signleston,请使用alreadyHasErrorOnPage,因为这会导致竞争条件,并且每个请求/响应都不会出现一致的默认状态。如果它们不是单例,并且为每个请求/响应创建一个新的 SomeValidator 实例,那么使用 hasHasErrorOnPage 是安全的。
对以下内容持保留态度,因为我不确定其中有多少与我当前正在从事的项目具体相关。
验证者是我们项目中的单例。我进去调试应用程序,发现实例成员在第二次请求/响应后不处于默认状态。本质上,它们继承了第一个或之前的请求/响应的值。
我仍然不确定的原因是因为我们的项目似乎已经包装了 ValidatorSuppport 并公开了我们的 validator 实现的接口(interface)。在我们的代码库中,似乎有一些代码将 validator 的实例存储在映射中,本质上使它们成为单例。我无法确定普通 struts2 的行为方式是否相同。
最佳答案
它们应该有一个状态,因为状态是验证的主题,应该在执行之前将其设置给 validator 。 validator 实例的构建方式应与 Struts2 中的操作相同。
该对象通过 validate 方法传递给 Validator
。它有一个签名
void validate(Object object) throws ValidationException;
通常,对象
是您可以在方法实现中验证的操作实例。 validator 实例是通过 validator 工厂构建的。一种是使用对象工厂来构建 validator ,如果有可用的注入(inject)器,则将其注入(inject)容器。但是对象工厂,无论您使用什么实现,都只需创建一个新实例并返回它。因此,每次使用 validator 工厂构建 validator 时,都会创建新实例。然后,您可能会看到 Validator
具有 message
、messageKey
、messageParameters
等属性。这些属性定义 Validator
的状态。您可以使用自定义属性扩展 ValidatorSupport,无需担心。因为每次验证都会创建 validator 的新实例,所以它是线程安全的。
Can it have state or does it have to be stateless?
它已经有状态了,无状态 bean 没有公共(public)属性。
关于java - 扩展 Struts2/XWork ValidatorSupport 的类可以有状态吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31355615/