2015-07-11 60 views
1

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

我知道动作类不是单身人士,可以有状态,但我不确定他们相关的验证器。

我需要知道,如果我可以有一个实例变量内的验证程序,扩展ValidatorSupport。例如:

public class SomeValidator extends ValidatorSupport { 
    private boolean alreadyHasErrorOnPage; 

} 

如果验证是signlestons,使用alreadyHasErrorOnPage因为这将导致竞争条件,从来没有为每个请求/响应一致的默认状态。如果它们不是单例,并且为每个请求/响应创建一个新的SomeValidator实例,那么使用alreadyHasErrorOnPage将是安全的。

因为我不确定它有多少与我目前正在进行的项目有特定的相关性,所以请加上一点盐。

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

我仍然不确定的原因是因为我们的项目似乎包装了ValidatorSuppport,并暴露了验证器实现的接口。在我们的代码库中,似乎有一些代码将验证器的实例存储在地图中,实际上使它们成为单例。我一直无法确定股票struts2的行为方式是否相同。

+0

什么样的状态?例如,验证器已经声明存储配置,如字符串的最大/最小长度。 –

+0

关于当前会话的状态我想。我不太清楚如何解释它。验证器的工作方式是将动作的一个实例传递给validate方法。然后我们使用getter和setter来获取我们想要验证的数据。所以我想我的问题可能是它应该在当前的请求/响应中存储信息?本质上是那些类Singleton的或者是他们为每个请求/响应创建的实例 –

+0

您将实例传递给验证器时?我的意思是,验证器在他们的“验证”方法中获得对象;它们不存储在验证器本身中。我不清楚你想要做什么,但我很怀疑。无论如何,测试会很容易,对吧?我不记得我的头顶,但如果它们是按请求创建的,我会感到惊讶。 –

回答

0

它们应该有一个状态,因为状态是要验证的主题,应该在执行前将其设置为验证程序。验证器实例应该像Struts2中的动作一样构建。

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

void validate(Object object) throws ValidationException; 

一般来说,object是,你可以在方法实现验证操作实例。验证器实例是通过验证器工厂构建的。一个是用对象工厂来构建验证器,如果有可用的注入器,则用容器注入它。但是对象工厂,您使用的是什么实现,只需创建一个新实例并将其返回即可。因此,每次使用验证工厂构建验证器时,都会创建新实例。然后,如您所见,Validator具有诸如message,messageKey,messageParameters等的属性。这些属性定义了Validator的状态。您可以使用自定义属性扩展ValidatorSupport,而不用担心。由于每次验证都会创建验证程序的新实例,因此它是线程安全的。

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

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

+0

验证器在他们的“验证”调用中获得对象,但它们没有设置在验证器本身上。 –

+0

@DaveNewton他们不能在验证器本身设置一个对象,为什么? –

+0

从技术上讲,你*可以*,但因为它已经被发送到'验证'方法,我不知道你为什么要*。我真的不记得他们是否在应用程序配置或每个请求期间被实例化;如果它是每个请求,看起来像是一堆开销,因为你必须重新评估验证参数,它在我的列表上至看起来:) –