Если это произойдет, если вы код в Sublime Text 3, это может помочь вам с проблемами с отступом
В Sublime Text при редактировании файла Python:
Меню Sublime Text > Настройки > Настройки - Синтаксис Конкретный :
Python.sublime-settings
{
"tab_size": 4,
"translate_tabs_to_spaces": true
}
Это вызвано использованием <f:validateRegex>
, свойства которого зависят от текущего итерационного элемента <ui:repeat>
.
Тегами <f:xxx>
являются обработчики тегов, а не компоненты пользовательского интерфейса. Обработчики тегов анализируются и оцениваются, когда дерево компонентов пользовательского интерфейса должно быть построено во время времени сборки. Все EL оцениваются во время сборки представления. Тегами <h:xxx>
и некоторыми <ui:xxx>
тегами, такими как <ui:repeat>
, являются компоненты пользовательского интерфейса. Все их EL оцениваются во время визуализации рендеринга.
Итак, в вашем случае, когда <f:validateRegex>
получает синтаксический анализ и выполняется, #{field}
недоступен в текущей области EL и, следовательно, оценивается как null
.
Существует несколько способов заставить его работать.
Field
, и ссылаться на него следующим образом: <h:inputText ... validator="#{field.validate}" />
с классом Field
, в котором вы его вручную создаете: public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (pattern != null) {
RegexValidator regexValidator = new RegexValidator();
regexValidator.setPattern(pattern);
regexValidator.validate(context, component, value);
}
}
#{eventMgmt.eventFields}
в ListDataModel<Field>
и привяжите валидатор к компоненту #{eventMgmt}
. Таким образом, вы сможете установить свойства валидатора на основе данных строки: <h:inputText ... validator="#{eventMgmt.validate}" />
в классе базового компонента позади #{eventMgmt}
: private DataModel<Field> model;
private RegexValidator regexValidator;
@PostConstruct
public void init() {
regexValidator = new RegexValidator();
}
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String pattern = model.getRowData().getPattern();
if (pattern != null) {
regexValidator.setPattern(pattern);
regexValidator.validate(context, component, value);
}
}
Validator
, который расширяет RegexValidator
и устанавливает шаблон как пользовательский атрибут компонента <f:attribute>
и позволяет перехватить Validator
. <f:attribute>
в основном добавляет новый атрибут к компоненту с неоцененным ValueExpression
, поэтому он будет переоценен при его вызове. Например: <h:inputText ...>
<f:validator validatorId="extendedRegexValidator" />
<f:attribute name="pattern" value="#{field.pattern}" />
</h:inputText>
с @FacesValidator("extendedRegexValidator")
public class ExtendedRegexValidator extends RegexValidator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String pattern = (String) component.getAttributes().get("pattern");
if (pattern != null) {
setPattern(pattern);
super.validate(context, component, value);
}
}
}
<o:validator>
. Например. <h:inputText ...>
<o:validator validatorId="javax.faces.RegularExpression" pattern="#{field.pattern}" />
</h:inputText>
Да, вот и все. <o:validator>
будет следить за тем, чтобы все атрибуты оценивались как отложенные выражения вместо непосредственных выражений.