2012-01-08 2 views
5

Должен ли я регистрировать пользовательский валидатор в faces-config.xml, если я использую JSF 2.0.4? Мой пользовательский валидатор использует интерфейс Validator, который равен javax.faces.validator.Validator.Как указать валидатор для входного компонента внутри составного компонента?

<cc:myComp id="customcomp1" ... /> 

<cc:myComp id="customcomp2" ...> 
    <f:validator id="myvalidator" for="myComp" /> 
</cc:myComp> 

myComp.xhtml

<cc:interface> 
    <cc:attribute ... /> 
    <!-- more attributes --> 
</cc:interface> 
<cc:implementation> 
    <h:panelGroup layout="block"> 
     <h:inputText id="firstName" ... /> 
     <h:inputText id="middleName" ... /> 
     <h:inputText id="lastName" ... /> 
    </h:panelGroup> 
</cc:implementation> 
+0

Возможно, вы используете пользовательский компонент или составной компонент. Вам нужно показать, как вы его создали. Возможно, вы просто не делегировали валидатор должным образом. – BalusC

ответ

5

Согласно примере кода в обновленной вопрос, вы, кажется, не делегируете валидатор на правильный ввод вообще, поэтому валидатор просто игнорируется вообще.

Необходимо указать желаемый ввод (для которого вы хотите присоединить валидатор) в качестве <composite:editableValueHolder> в <composite:interface>.

<cc:interface> 
    <cc:editableValueHolder name="forName" targets="inputId" /> 
    ... 
</cc:interface> 
<cc:implementation> 
    ... 
    <h:inputText id="inputId" ... /> 
    ... 
</cc:implementation> 

выше <composite:editableValueHolder> в основном говорит, что любая <f:validator for="forName"> должен быть применен на <h:inputText id="inputId">. Таким образом, следующий должен затем сделать это:

<cc:myComp> 
    <f:validator id="myValidator" for="forName" /> 
</cc:myComp> 

Вы даже можете использовать то же самое значение в name и targets, но ключевым моментом является то, что должно быть <composite:editableValueHolder> подарок, так что JSF знает, на какой компонент ввода точно вы можете видеть, что валидатор должен быть целенаправленным, а может быть более одного входного компонента.

+0

Большое вам спасибо! –

+0

Добро пожаловать. – BalusC

+0

1up для вас и Chichiray. :) –

1

Нет. Это не является необходимым с JSF 2.0. Просто отметьте свой валидатор с помощью @FacesValidator. Аннотации автоматически регистрируют ваш валидатор. Нет необходимости в xml.

+0

По какой-то причине мой валидатор не работает. Пожалуйста, проверьте изменение –

3

Если вы работаете с JSF 2, я не думаю, что вам нужно прикоснуться к файлу faces-config.xml, чтобы создать клиента Validator. Вы можете просто использовать аннотацию @FacesValidator, чтобы объявить Validator. Это должно быть что-то вроде этого:

@FacesValidator("myValidator") 
public class MyValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     // Your logic 
    } 

} 

Затем вы можете начать использовать его на вашей странице .xhtml с, например, <f:validator> тег:

<f:validator validatorId="myValidator" /> 
+0

. Я сделал точно так, как указано выше, в классе myValidator, но все равно его не вызывают. –

+0

Пожалуйста, проверьте обновление в моем вопросе. –

+1

@Altair: можете ли вы разместить код для своего 'Validator', а также ваш составной компонент? «Валидатор» должен быть зарегистрирован для одного входа, а не для всего компонента. –

Смежные вопросы