Могут ли классы, расширяющие 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
с пользовательскими свойствами без страха. Поскольку новый экземпляр валидатора создается каждый раз для каждой валидации, он безопасен для потоков.
Может ли оно иметь состояние или оно должно быть без гражданства?
У него уже есть состояние, бин без гражданства не имеет общедоступных свойств.