2012-05-10 2 views
1

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

<h:panelGroup>Session ID</h:panelGroup> 
<h:panelGroup> 
    <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > 
     <f:validateLength minimum="0" maximum="15"/> 
     <f:validator validatorId="ValidatorController" > 
     </f:validator> 
     <f:ajax event="blur" render="sessionidMessage" />           
    </h:inputText> 
    <h:message id="sessionidMessage" for="sessionid" /> 
</h:panelGroup> 

Это валидатор:

@FacesValidator("ValidatorController") 

    public class FormValidator implements Validator { 

     public FormValidator() { 
     } 

     @Override 
     public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
      if (value.equals("test")) { 
       throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
         " Session ID is already in use, please choose another.", null)); 
      } 
     } 
} 

Этот код работает отлично. Я также пытался реализовать этот код, чтобы использовать CDI в валидатор:

<h:panelGroup>Session ID</h:panelGroup> 
<h:panelGroup> 
    <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > 
     <f:validateLength minimum="0" maximum="15"/> 
     <f:validator binding="#{ValidatorController}" > 
      <f:attribute name="type" value="sessionid" /> 
     </f:validator> 
     <f:ajax event="blur" render="sessionidMessage" />           
    </h:inputText> 
    <h:message id="sessionidMessage" for="sessionid" /> 
</h:panelGroup> 

Это валидатор:

@Named("ValidatorController") 

public class FormValidator implements Validator { 

    public FormValidator() { 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     if (value.equals("test")) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
        " Session ID is already in use, please choose another.", null)); 
     } 
    } 

} 

По какой-то причине второй пример не работает.

ответ

0

Вы должны уточнить, что не удается? Он не компилируется? Это не работает? Каково исключение и т. Д. И также неясно, чего вы пытаетесь достичь во втором случае.

В общем, вы не можете передать атрибут f: validator, вставив f: атрибут insside. сделать ваш код выглядеть следующим образом:

<f:validator binding="#{ValidatorController}" (session id in your case) /> 
<f:attribute name="type" value="sessionid" /> 

Позже вы можете искать компонента параметра внутри компонента параметра Карта:

context.getExternalContext().getRequestParameterMap(); 
Смежные вопросы