java - 扩展 Struts2/XWork ValidatorSupport 的类可以有状态吗

标签 java validation struts2 xwork

如果您在 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 具有 messagemessageKeymessageParameters 等属性。这些属性定义 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/

相关文章:

javascript - 1000hz 验证器检查最小值、最大值和特定值

validation - Laravel验证PDF MIME

java - struts2中执行并等待拦截器

java - neo4j中如何遍历节点属性的顺序列表?

java - 如何在设备旋转时保持 map 状态?

java - 使用 Spring Hateoas 可分页

java - 实践中的并发设计原则

c# - 如何跨同一实体的实例实现实体验证

java - 在 Struts2 中使用 Tuckey URL Rewrite 在 URL Rewrite 方面需要帮助

java - struts登录后如何重定向到上一页