Java 扩展Struts2/XWork Validator支持的类是否具有状态

Java 扩展Struts2/XWork Validator支持的类是否具有状态,java,validation,struts2,xwork,Java,Validation,Struts2,Xwork,如果扩展Struts 2中的ValidatorSupport类,那么该类上是否可以有实例变量?它可以有状态,还是必须是无状态的 我知道action类不是单例类,可以有state,但我不确定它们关联的验证器 我需要知道我是否可以在验证程序中拥有一个扩展ValidatorSupport的实例变量。例如: public class SomeValidator extends ValidatorSupport { private boolean alreadyHasErrorOnPage; }

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

我知道action类不是单例类,可以有state,但我不确定它们关联的验证器

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

public class SomeValidator extends ValidatorSupport {
    private boolean alreadyHasErrorOnPage;

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

对以下内容持保留态度,因为我不确定其中有多少内容与我目前正在进行的项目有关

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


我仍然不确定的原因是,我们的项目似乎已经包装和验证程序支持并公开了一个验证程序实现的接口。在我们的代码库中,似乎有一些代码将验证器的一个实例存储在一个映射中,从而使它们成为单例。我无法确定stock struts2是否以同样的方式运行。

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

对象通过validate方法传递给
验证器
。它有签名

void validate(Object object) throws ValidationException;  
通常,
对象
是可以在方法实现中验证的操作实例。验证器实例是通过验证器工厂构建的。一个用于对象工厂构建验证器,并在有可用注入器的情况下使用容器注入验证器。但是对象工厂,不管您使用什么实现,只需创建一个新实例并返回它。因此,每次使用验证器工厂构建验证器时,都会创建新实例。然后,正如您可能看到的那样,
验证器
具有诸如
消息
消息键
消息参数
等属性。这些属性定义了
验证器的状态。您可以使用自定义属性扩展
验证器支持
。因为每次验证都会创建新的验证器实例,所以它是线程安全的

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


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

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

对象通过validate方法传递给
验证器
。它有签名

void validate(Object object) throws ValidationException;  
通常,
对象
是可以在方法实现中验证的操作实例。验证器实例是通过验证器工厂构建的。一个用于对象工厂构建验证器,并在有可用注入器的情况下使用容器注入验证器。但是对象工厂,不管您使用什么实现,只需创建一个新实例并返回它。因此,每次使用验证器工厂构建验证器时,都会创建新实例。然后,正如您可能看到的那样,
验证器
具有诸如
消息
消息键
消息参数
等属性。这些属性定义了
验证器的状态。您可以使用自定义属性扩展
验证器支持
。因为每次验证都会创建新的验证器实例,所以它是线程安全的

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


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

什么样的状态?例如,验证器具有存储配置的状态,比如字符串的最大/最小长度。我猜是关于当前会话的状态。我不太清楚该怎么解释。验证器的工作方式是将操作的实例传递给validate方法。然后,我们在操作上使用getter和setter来获取我们想要验证的数据。所以我想我的问题可能是,它是否应该存储当前请求/响应的信息?本质上,这些类是单例类还是为每个请求/响应创建的实例您何时将实例传递给验证器?我的意思是,验证器通过
validate
方法获取对象;它们不存储在验证器本身中。我不清楚你想干什么,但我很怀疑。在任何情况下,测试都很容易,对吗?我想不起来了,但如果它们是根据请求创建的,我会感到惊讶。@DanKing我觉得这很有趣,但你能详细说明一下为什么需要这些信息,以及这些信息会对你开发的软件产生什么影响吗?@RomanC我编辑了这个问题,并提供了一些关于它为什么重要的信息。我发现我的答案与我的项目有关,但我“我仍然不确定这是默认的struts2行为还是对我们如何实现验证器的一个副作用。什么样的状态?例如,验证器具有存储配置的状态,比如字符串的最大/最小长度。我猜是关于当前会话的状态。我不太清楚该怎么解释。验证器的工作方式是将操作的实例传递给validate方法。然后,我们在操作上使用getter和setter来获取我们想要验证的数据。所以我想我的问题可能是它应该停止吗