Могут ли классы, расширяющие Struts2/XWork ValidatorSupport, иметь состояние

Если вы продлите ValidatorSupport класс в Struts 2 вы можете иметь переменные экземпляра в классе? Может ли оно иметь состояние или оно должно быть без гражданства?

Я знаю, что классы действий не являются синглетонами и могут иметь состояние, но я не уверен насчет связанных с ними валидаторов.

Мне нужно знать, могу ли я иметь переменную экземпляра в валидаторе, который расширяет ValidatorSupport, Например:

public class SomeValidator extends ValidatorSupport {
    private boolean alreadyHasErrorOnPage;

}

Если валидаторы являются сигнальными знаками, то для этого используется уже HasErrorOnPage, так как это приведет к состоянию гонки и никогда не будет непротиворечивым состоянием по умолчанию для каждого запроса / ответа. Если они не являются синглетонами, и для каждого запроса / ответа создается новый экземпляр SomeValidator, тогда использование уже HasErrorOnPage будет безопасным.

Возьмите следующие слова с небольшим количеством соли, потому что я не уверен, сколько из них конкретно связано с проектом, над которым я сейчас работаю.

Валидаторы - одиночки в нашем проекте. Я вошел и отладил приложение и обнаружил, что члены экземпляра не находятся в состоянии по умолчанию после второго запроса / ответа. По сути, они переносят значение из первого или предыдущего запроса / ответа.

Причина, по которой я до сих пор не уверен, заключается в том, что наш проект обернулся и ValidatorSuppport и показал интерфейс, который реализуют наши валидаторы. В нашей кодовой базе, кажется, есть код, который хранит экземпляр валидаторов в карте, по существу делая их одиночными. Я не смог определить, ведут ли себя фондовые стойки2 таким же образом.

1 ответ

У них должно быть состояние, потому что состояние подлежит проверке, которое должно быть установлено на валидатор перед его выполнением. Экземпляр валидатора должен быть построен так же, как и действия в Struts2.

Объект передается Validator через метод проверки. Имеет подпись

void validate(Object object) throws ValidationException;  

Как правило, object это экземпляр действия, который вы можете проверить в реализации метода. Экземпляр валидатора создается через фабрику валидаторов. Один использует фабрику объектов, чтобы построить валидатор и внедрить его в контейнер, если есть доступные инжекторы. Но фабрика объектов, какую бы реализацию вы ни использовали, просто создайте новый экземпляр и верните его. Таким образом, каждый раз, когда вы используете фабрику валидатора для создания валидатора, создается новый экземпляр. Тогда, как вы могли видеть Validator имеет такие свойства, как message, messageKey, messageParametersи т. д. Эти свойства определяют состояние Validator, Вы можете продлить ValidatorSupport с пользовательскими свойствами без страха. Поскольку новый экземпляр валидатора создается каждый раз для каждой валидации, он безопасен для потоков.

Может ли оно иметь состояние или оно должно быть без гражданства?

У него уже есть состояние, бин без гражданства не имеет общедоступных свойств.

Другие вопросы по тегам